feed twitter facebook LinkedIn facebook

Java » Mandar emails con JavaMail

noviembre 10, 2006 por Víctor Cuervo 27 Comentarios Imprimir Imprimir

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).

  1. Properties props = new Properties();
  2.  
  3. props.put("mail.smtp.host","mail.lineadecodigo.com");
  4. props.put("mail.transport.protocol","smtp");
  5. props.put("mail.smtp.auth", "true");
  6. props.setProperty("mail.user", "myuser");
  7. props.setProperty("mail.password", "mypwd");

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

  • mail.smtp.host, representa el host que hace de servidor de correo
  • mail.transport.protocol, es el protocolo de comunicación que queremos utilizar para enviar el correo. En este caso es SMTP, pero podría ser mail.
  • mail.smtp.auth, indica si se requiere de autentificación de SMTP.
  • mail.user, es el usuario de la conexión.
  • mail.password, el el password de 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.

  1. 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:

  1. 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),..

  1. msg.setSubject("Mensaje de Línea de Código");
  2. msg.setFrom(new InternetAddress("web@lineadecodigo.com","Línea de Código"));
  3. 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:

  1. ew 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:

  • Message.RecipientType, el tipo de usuario que va a recibir el mensaje. Los valores serían TO, CC, BCC. O en español: para, en copia y en copia oculta.
  • Adress[], como direcciones de email. Ya vimos anteriormente que los emails se montan con la clase InternetAddress.

4. Configurar el texto del mensaje

Para insertar el texto del mensaje utilizaremos el método .setDataHandler(DataHandler). El handler, representado por un DataHandler, 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.

  1. DataHandler dh = new DataHandler("Texto del mensaje","text/plain");
  2. 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:

  1. 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.

Descargar el Codigo
Descargar el código
Error en el Codigo
Error en el código
Foro sobre Java Mail
Foro sobre Java Mail
tags: , , , , , ,

Artículos relacionados:

27 comentarios »

RSS feed para los comentarios de esta entrada. TrackBack URI

1 2 3
  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

1 2 3

Deja un comentario

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*