• 04/06/2014
  • admin
  • 4

En nuestro artículo anterior sentamos las bases para poder trabajar con JavaMail, en esta segunda parte estudiaremos como mandar un correo con JavaMail. Suponemos que ya te has bajado JavaMail y JAF. Vamos a ver cómo enviar un correo simple, un simple texto, usando JavaMail. Para el ejemplo, usaremos una cuenta de gmail como servidor de correo.

La configuración de esta cuenta (de cualquier cuenta de gmail) para el envío de correos es:

Requiere usuario y password. El usuario es la cuenta de correo, pondremos por ejemplo, ejemplo@gmail.com
Protocolo smtp
TLS si está disponible
Puerto 587, que no es el de defecto de smtp.

Clases y configuración de JavaMail para el envío de mensajes

Para este ejemplo sencillo, hay tres clases de JavaMail implicadas:

Session: De alguna forma representa la conexión con el servidor gmail de correo. Hay que obtenerla pasándole los parámetros de configuración para el servidor de correo -gmail en nuestro caso-.
Transport: Clase para el envío de mensajes. Se obtiene llamando al método getTransport() de la clase Session.
MimeMessage: El mensaje.
Creación y configuración de la clase Session de JavaMail

La clase Session representa nuestra conexión con el servidor de correo -gmail en nuestro caso-. Se obtiene con el método Session.getDefaultInstance() pasándole un parámetro:

Un Properties con las propiedades de la conexión.
Properties es una clase de java estándar java.util.Properties. Esta clase admite que guardemos en ella parejas «clave-valor», es decir, guardamos datos -de tipo String- dándoles un nombre a cada uno para luego poder recuperarlos. Esto se hace por medio del método setProperty(), de esta manera

Properties p = new Properties();
p.setProperty(«un nombre», «un valor»);
p.setProperty(«PI», «3.1416»);

Las Properties que necesita Session son específicas, es decir, tienen que tener unos nombres concretos y unos posibles valores concretos. En la API una lista de algunas de ellas y también en la API tienes una lista más completa.

Veremos aquí sólo las estrictamente necesarias para conectarnos con gmail y poder enviar mensajes. El código sería este

Properties props = new Properties();

// Nombre del host de correo, es smtp.gmail.com
props.setProperty(«mail.smtp.host», «smtp.gmail.com»);

// TLS si está disponible
props.setProperty(«mail.smtp.starttls.enable», «true»);

// Puerto de gmail para envio de correos
props.setProperty(«mail.smtp.port»,»587″);

// Nombre del usuario
props.setProperty(«mail.smtp.user», «ejemplo@gmail.com»);

// Si requiere o no usuario y password para conectarse.
props.setProperty(«mail.smtp.auth», «true»);

Con esto estamos en disposición de obtener nuestra instancia de Session.

Session session = Session.getDefaultInstance(props);
session.setDebug(true);

Hemos puesto setDebug(true) para obtener más información por pantalla de lo que está sucediendo. Una vez que el programa nos funcione, podemos quitar esa línea sin problemas.

Ya tenemos nuestro objeto Session.

Construir el mensaje para enviar con JavaMail

Vamos ahora a construir un mensaje simple de texto. Para ellos instanciamos la clase MimeMessage y le ponemos varios datos.

En el constructor debemos pasarle el objeto Session que obtuvimos anteriormente

MimeMessage message = new MimeMessage(session);

Ponemos luego el FROM y el TO del mensaje, es decir, quién lo envía y a quién va dirigido. Para meter estos datos usaremos los métodos setFrom() y addRecipient() de MimeMesage. Los parámetros que admiten estos métodos son instancias de javax.mail.internet.InternetAddress. En el constructor de esta clase InternetAddress símplemente ponemos la dirección de correo -ver código más abajo-.

Para los destinatarios usaremos el método addRecipient() de MimeMessage. Esta método admite dos parámetros, una constante para indicar el tipo de destinatario y otro que es el InternetAdress mencionado. El tipo de destinatario puede ser

Message.RecipientType.TO Destinatario principal del mensaje
Message.RecipientType.CC Destinatario al que se envía copia del mensaje
Message.RecipientType.BCC Destinatario al que se envía copia, pero sin que los demás destinatarios puedan verlo.
En nuestro caso, sólo pondremos el TO y la dirección de correo.

// Quien envia el correo
message.setFrom(new InternetAddress(«ejemplo@gmail.com»));

// A quien va dirigido
message.addRecipient(Message.RecipientType.TO, new InternetAddress(«destinatario@dominio.com»));

Ahora sólo queda llenar el asunto -subject que dirían los ingleses- del mensaje y el texto. Como tenemos métodos para ello, setSubject() y setText(), no hay ningún problema.

message.setSubject(«Hola»);
message.setText(«Mensajito con Java Mail» +
«de los buenos.» +
«poque si»);

Ya tenemos construido el mensaje.

Un pequeño detalle nada más. Este mensaje es de texto y el formato que se está usando es texto «plano», es decir, texto normalito, tal cual, sin más. Hay muchas formas de enviar texto. Se puede enviar, por ejemplo, en formato html, con lo que podríamos poner negritas, cursivas, etc.

Para enviar texto con otros formatos, debemos usar el mismo método setText(), pero con más parámetros. En concreto, podemos usar la versión de setText() que admite tres parámetros:

El texto, en formato html -o el que decidamos-
El juego de caracteres a utilizar. Por ejemplo, puede ser «ISO-8859-1», que corresponde a nuestro juego de caracteres.
El formato a utilizar. Para un html sería «html». No se puede poner cualquier cosa, hay que utilizar subtipos estandar de los tipos MIME (Multipurpose Internet Mail Extension). Al utilizar setText(), la primera parte de este tipo se presupone «text». El subtipo «hmtl» es el que ponemos aquí. El siguiente código crearía el mismo mensaje, pero con texto html y algún adorno de negrita y cursiva

message.setText(
«Mensaje con Java Mail<br>» + «<b>de</b> los <i>buenos</i>.» + «poque si»,
«ISO-8859-1»,
«html»);

Enviamos el mensaje

Para enviar el mensaje usamos la clase Transport, que se obtiene de Session. El método getTransport() requiere un parámetro String con el nombre del protocolo a usar. Como el de gmail es smtp, pues ponemos smtp.

Transport t = session.getTransport(«smtp»);

Ahora debemos establecer la conexión, dando el nombre de usuario y password.

t.connect(«ejemplo@gmail.com»,»la password»);

y ahora simplemente enviamos el mensaje

t.sendMessage(message,message.getAllRecipients());

El método de enviar mensaje es sendMessage() y NO sólo send(). El método send() es estático y no tiene en cuenta la conexión, ni el usuario ni la password. Es una forma rápida de envio de mensaje para un servidor smtp que no requiera autentificación. Como no es el caso, debemos usar sendMessage().

El método sendMessage(), además del mensaje, necesita la lista de receptores del mensaje, es decir, el array de direcciones a los que va el mensaje. La forma rápida de obtener este array es llamar al método getAllRecipients() de la clase MimeMessage, justo como lo hemos hecho en el código.

Con esto se envía el mensaje. Ahora solo queda cerrar la conexión

t.close();

Finalmente, aquí tienes el programa completo que he hecho con mi cuenta de gmail para probar: EnviarMail.java.

En nuestro siguiente articulo veremos cómo recibir correos con JavaMail.

Si te ha gustado este articulo comparte¡¡

 

Muchas gracias

4 comments on “Mini tutorial JavaMail – Enviar un correo con JavaMail (Parte II)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies