jump to navigation

Mandar emails con JavaMail Noviembre 10, 2006

Publicado por lineadecodigo en : Java , trackback

Una buena funcionalidad a incluir dentro de cualquier página web es el envío de correos. El poder adjuntarla información que estamos leyendo en ese momento, vía correo a otra persona (o a si mismo).

El API de JavaMail nos permite el envio de correos. Abstrayendonos de los protocolos de comunicación para el envío de emails (SMTP, POP3, MAIL,...).

Con muy pocas líneas de código nos permite el enviar un mensaje a una dirección de correo electrónico.

Los pasos a seguir serán:

  1. Propiedades den envío
  2. Obtener la sesión
  3. Configurar los campos del mensaje
  4. Configurar el texto del mensaje
  5. Enviar el mensaje

1. Propiedades de envio

Lo primero que tenemos que hacer es configurar las propiedades del envío. Es decir, cual es el servidor de correo que vamos a utilizar, si el servidor requiere autentificación, el tipo de transporte a utilizar,..

Todas las configuraciones las definimos mediante la clase Properties. Para incorporar una propiedad utilizamos el método .put(propiedad,valor).

Properties props = new Properties();

props.put("mail.smtp.host","mail.lineadecodigo.com");
props.put("mail.transport.protocol","smtp");
props.put("mail.smtp.auth", "true");
props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");

Al menos las cuatro primeras propiedades son necesarias para realizar la conexión:

2. Obtener la sesión

Una vez que tengamos definidas las propiedades, pasaremos a establecer la sesión con el servidor de correo. La sesión se establece mediante la clase Session.

Session mailSession = Session.getInstance(props,null);

3. Configurar los campos del mensaje

Sobre la sesión de correo vamos a crear un mensaje. Los mensajes se manejan mediante la clase Message. Para instanciarlo utilizaremos la siguiente línea de código:

Message msg = new MimeMessage(mailSession);

El mensaje hay que rellenarlo con datos: el usuario destino, el texto del mensaje, el "subject" del mensaje,... Para esto contamos con diferentes métodos dentro de la clase MimeMessage como .setSubject(String), setFrom(Adress),..

msg.setSubject("Mensaje de Línea de Código");
msg.setFrom(new InternetAddress("web@lineadecodigo.com","Línea de Código"));
msg.addRecipients(Message.RecipientType.TO, new InternetAddress[] { new InternetAddress("miamigo@gmail.com") });

Entremos un poco más en detalle en estos métodos...

En el caso del .setSubject(String) no tiene mucho misterio, ya que simplemente es una línea de texto que represente el subject del correo.

Para el método .setFrom(Adress) vemos que el parámetro que recibe es una clase Address. Esta clase viene a abstraer la dirección de email para los correos electrónicos.

Es por ello que tendremos que utilizar el constructor InternetAddress para crear una dirección de email. El constructor recibe dos parámetros, la dirección de email y el nombre asociado a dicha dirección (nombre que suelen usar los programas de correo como referente).

Veámos esa línea de código:

new InternetAddress("web@lineadecodigo.com","Línea de Código")

A la hora de especificar los destinatarios tenemos que utilizar el método .addRecipients(Message.RecipientType,Adress[]) Los parámetros de este método son dos:

4. Configurar el texto del mensaje

Para insertar el texto del mensaje utilizaremos el método .setDataHandler(DataHandler). El handler tendrá el texto que se va a enviar y el tipo de codificación que le queremos aplicar. En este caso será "text/plain", ya que vamos a enviar texto plano.

DataHandler dh = new DataHandler("Texto del mensaje","text/plain");
msg.setDataHandler(dh);

5. Enviar el mensaje

El mensaje se enviará mediante la clase Transport. Esta clase tiene un método estático que se llama .send(Message). Dicho método recibirá el mensaje que hemos montado anteriormente como parámetro y lo enviará.

Solo necesitaremos la siguiente línea de código:

javax.mail.Transport.send(msg);

En el procesode envío multiples excepciones pueden ser elevadas. Es por ello que deberemos de ejecutar todo nuestro código entre un try-catch.

Articulos Similares:

Enviar entrada por email Enviar entrada por email | Imprimir Imprimir | 14313 visitas

1 Star2 Stars3 Stars4 Stars5 Stars (5 votos, media: 4.00 de 5)
Loading ... Loading ...

Comentarios»

1. erik guerrero - Enero 15, 2007

me parece muy bien el ejemplo solo que casi todos los sitios web que contienen la informacion del javamail mencionan lo mismo pero no muestran en realidad un ejemplo de el codigo completo para una aplicacion la pregunta seria y si quiero manejar un win application como lo configuro?

bueno pero la realidad es que me gusto la explicacion.

2. Rodrigo - Enero 30, 2007

Muy buena expliación de como enviar correos con JavaMail

3. Wolverine - Marzo 12, 2007

Es un buen ejemplo….

4. david - Marzo 12, 2007

se agradece muchisisisimo!!

5. George - Junio 18, 2007

Excelente artículo, corto, especifico y muy productivo.
Muchas gracias a su autor

6. digdig - Julio 21, 2007

Buen artículo, me viene genial para organizarme las ideas.
Soló hecho en falta como adjuntar archivos y contar más en detalle que tipo de excepciones puede lanzar javax.mail.Transport.send(msg). ¿Estas excepciones están relacionados con los atributos de msg ó se refiere a mensajes de error del servidor de correo como respuesta a mensajes mal formados o dirigidos a una cuenta inexistente?
Será mirar la documentación de las clases.

Lo que no se implementar es como puedo mandar desde una página HTML formada dinámicamente con JSP un email que tenga como contenido esa pagina HTML con sus imagenes.

Un saludo :-)

7. digdig - Julio 21, 2007

Un dato importante para no llevarse sorpresas a la hora de implementar:

El API Java Mail

El Interfaz de Programación de Aplicaciones de Java para email es una librería
de clases para clientes de email que permiten comunicar con servidores SMPT,
POP e IMAP.
Es una extensión de Java (no forma parte del núcleo JDK). Es necesario
disponer del fichero mailapi.jar !! donde están implementadas las clases
necesarias.

Pues eso que sin importar esa libreria no te reconoce algunas clases.

8. digdig - Julio 21, 2007

Finalmente parece que la libreria si viene incluida en la plataforma Java pero sólo en J2EE no asi en J2SE.

The JavaMail API provides a platform-independent and protocol-independent framework to build mail and messaging applications. The JavaMail API is available as an optional package for use with Java SE platform and is also included in the Java EE platform.

Mas info y descargas en:
http://java.sun.com/products/javamail/

9. Raúl Alvarez Guale - Agosto 15, 2007

Excelente trabajo

10. jorge - Septiembre 5, 2007

hola

11. xoue - Octubre 3, 2007

import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class GestorCorreo {

private static Properties props = new Properties();
private static Session mailSession;
private static Message msg;
private static Authenticator auth;

/** Creates a new instance of GestorCorreo */
public GestorCorreo() {

}

/**
* Configuramos los parametros de la cuenta de mail.
*/
public static void configuraCuenta(){
props.put(“mail.smtp.host”,”smtp.elalmazen.com”);
props.put(“mail.transport.protocol”,”smtp”);
props.put(“mail.smtp.auth”, “true”);
props.setProperty(“mail.user”, “info@elalmazen.com”);
props.setProperty(“mail.password”, “qwerty”);
}

/**
* Establece una sesion dada la configuracion de la cuenta.
*/
public static void estableceSesion(){
auth = new SMTPAuthenticator(“info@elalmazen.com”,”qwerty”);
mailSession = Session.getInstance(props,auth);
}

/**
*
*/
public static void configuraMensaje(){
try {

msg = new MimeMessage(mailSession);
msg.setSubject(“Mensaje de Prueba”);
msg.setFrom(new InternetAddress(“info@elalmazen.com”,”El Almazen”));
msg.addRecipients(Message.RecipientType.TO, new InternetAddress[] { new InternetAddress(“xoue82@gmail.com”) });

} catch (AddressException ex) {
ex.printStackTrace();
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
} catch (MessagingException ex) {
ex.printStackTrace();
}
}

public static void textoMensaje(){
try {

DataHandler dh = new DataHandler(“Mensaje de prueba”,”text/plain”);
msg.setDataHandler(dh);

} catch (MessagingException ex) {
ex.printStackTrace();
}
}

public static void enviaMensaje(){
try {

javax.mail.Transport.send(msg);

} catch (MessagingException ex) {
ex.printStackTrace();
}
}
}

import java.io.*;
import java.util.*;
import java.lang.*;
import javax.mail.*;
import javax.mail.internet.*;

public class SMTPAuthenticator extends javax.mail.Authenticator {

private String fUser;

private String fPassword;

public SMTPAuthenticator(String user, String password) {

fUser = user;

fPassword = password;

}

public PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication(fUser, fPassword);

}

}

Espero que os ayude

12. Mkb - Diciembre 10, 2007

es posible usar DataHandler para enviar mensaje en html??? porque lo que necesito es rescatar el mensaje desde un formulario html en un jsp y guardarlo en un avariable que paso como parametro cuando invoco la clase.elmetodo(). Esa es mi duda y agradeceria mucho si alguien me puede ayudar..

13. Qdberto - Abril 7, 2008

Como se cual es la direccion del host??

14. Ronald - Noviembre 6, 2008

hola esto es una pruba

15. matias - Enero 9, 2009

muy bueno me sirivio para quedar como un pelotudo cuando me preguntanban XD, jaja, no enserio una joya la explicacion

16. maraco - Mayo 6, 2009

chupame el pico

17. maribel - Agosto 31, 2009

me gustaria que me digera como hago para que aparte del mensaje que se escribe en el codigo para que envie poder adjuntar un archivo,,,pues ya utilice el metodo pero solo envia el mensaje que yo coloque en el codigo,,y ahorita necesito que me ayude para adjuntar una archivo y enviar ese archivo al correo.

18. pp - Febrero 11, 2010

alguien sabe si quiero usar como recepción un webmail (yahoo o gmail) como tengo que declarar las propiedades????

gracias

19. Nery - Agosto 24, 2010

muy bueno, como se hace que estos codigo funcionen en una pagina HTML y asi poder enviar un email de suscripcion sin tener que levantar nada.
Saludos

nery


Imagen CAPTCHA CAPTCHA Audio
Refrescar imagen