Mandar emails con JavaMail

10/nov/2006 Java , , , , , , 27 Comentarios
java

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.

Difunde el Conocimiento

Si te ha gustado el artículo o te ha sido de utilidad, no dejes de compartirlo con tus amigos en las redes sociales... Te estaremos muy agradecidos. :-D

27 comentarios en “Mandar emails con JavaMail”

Víctor Cuervo

david

Hola aportaria mucho si dejaran el proyecto! es que no me sale

Víctor Cuervo

Gisel

Funciona casi perfecto, me manda esta excepción : com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. du5sm629385qab.14
Qué puedo hacer?

Gracias!

Víctor Cuervo

Gisel

Muy buena explicación, si quiero manejar un win application como lo configuro?

Víctor Cuervo

Jose Eduardo

Donde puedo descargar el jar q contenga la Clase Mail en la libreria javax ???

Víctor Cuervo

edwar caro

DEDEDEDEDEDDDED

Víctor Cuervo

sub7

Esta tarde me puse y al final lo saqué, os dejo el link con el paquete compilado en .jar para que lo ejecuteis y tambien os dejo el codigo en un archivo de tecto.

Yo trabajo con linux, alomejor si abrís el archivo de texto en windows no se ve bien.

http://www.gigasize.com/get.php?d=mtb8o8zf2xc
Un saludo.

Víctor Cuervo

Nery

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

Víctor Cuervo

pp

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

gracias

Víctor Cuervo

maribel

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.

Víctor Cuervo

maraco

chupame el pico

Víctor Cuervo

matias

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

Víctor Cuervo

Ronald

hola esto es una pruba

Víctor Cuervo

Qdberto

Como se cual es la direccion del host??

Víctor Cuervo

Mkb

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

Víctor Cuervo

xoue

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

Víctor Cuervo

jorge

hola

Víctor Cuervo

Raúl Alvarez Guale

Excelente trabajo

Víctor Cuervo

digdig

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/

Víctor Cuervo

digdig

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.

Víctor Cuervo

digdig

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

Víctor Cuervo

George

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

Víctor Cuervo

david

se agradece muchisisisimo!!

Víctor Cuervo

Wolverine

Es un buen ejemplo….

Víctor Cuervo

Rodrigo

Muy buena expliación de como enviar correos con JavaMail

Víctor Cuervo

erik guerrero

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.

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*


*