HtmlEmail. Envío de emails en HTML con imágenes embebidas

3
39323

HtmlEmail. Envío de emails en HTML con imágenes embebidas

En este pequeño tutorial vamos a ver un ejemplo de como enviar correos electrónicos en formato HTML y texto plano a través del API Commons Email. Cabe destacar que esto no es más que un sencillo tutorial de referencia rápida, para más información deberéis dirigiros a la página oficial.

Cabe resaltar que la técnica que utilizo en el siguiente ejemplo es fácilmente adaptable a cualquier proyecto, así que espero os sea de utilidad en algún momento.

Manos a la obra….

El ejemplo

Contenido del email en texto plano: (archivo mail.txt)

Estimado usuario.

Bla bla bla 
	
	Nombre:    ${nombre} 
	Apellidos: ${apellidos}

Bla bla bla bla 

Un saludo.
Autentia Real Business Solutions.

Contenido del email en HTML: (archivo mail.html)

	
	
		Vive y deja vivir ;-)
	
	
		
		

Bla bla bla bla bla bla bla

  • Nombre: ${nombre}
  • Apellidos: ${apellidos}

Bla bla bla bla bla bla bla

Un saludo.

Parámetros de configuración necesarios para enviar el email: (archivo mail.properties)

mail.server=smtp.miservidor_de_correo.com
from.name=Carlos García Pérez
from.email=mi_correito@autentia.com
mail.subject=Vive y deja vivir ;-)

A continuación mostramos una sencilla aplicación (autoexplicativa) de consola en donde se ven los pasos para configurar y enviar el correo.

Gracias al uso del paquete Commons Email la aplicación se simplifica bastante, obviando ciertos detalles y conocimientos que serían necesarios usando otros paquetes como el javax.mail.

De todas formas no está de más conocérselo, pues commons email se apoya y depende de él para su funcionamiento.

package com.autentia.tutoriales.htmlmail;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;

import java.net.URL;
import java.util.Properties;

import org.apache.commons.lang.text.StrSubstitutor;
import org.apache.commons.mail.HtmlEmail;

/**
 * Envio de correos electrónicos en formato HTML con imágenes embebidas
 * @author Carlos García. Autentia Real Business Solutions.
 * Creador de http://www.mobiletest.es 
 */
public class SendHtmlEmail {
	/**
	 * Punto de entrada al ejemplo
	 * (Para este tutorial no hacemos un buen tratamiento de excepciones para tener el código sea más 
	 *  fácil de comprender.)
	 */
	public static void main(String[] args) throws Exception {
		HtmlEmail	email	= new HtmlEmail();
		String		html	= null;
		String		plain	= null; 
		StrSubstitutor strSub = null;
		
		// Para no usar beans u objetos que compliquen el código de este tutorial vamos a poner los valores 
		// de las propiedades que serán más adelante reemplazadas usando la clase java.util.Properties
		Properties usuario = new Properties();
		usuario.put("nombre",	 "Carlos");
		usuario.put("apellidos", "García Pérez");
		usuario.put("email",	 "tuemail@pepito.com");


		// Leemos el contenido del correo en formato texto plano y reemplazamos las expresiones por su valor
		// Usamos la clase StrSubstitutor del paquete "Commons Lang" para reemplazar las expresiones por su valor
		// http://commons.apache.org/lang/apidocs/index.html?org/apache/commons/lang/text/StrSubstitutor.html		
		plain  = SendHtmlEmail.fileToString(SendHtmlEmail.class.getResourceAsStream("/mail.txt"), "utf-8");
		strSub = new StrSubstitutor(usuario);
		plain  = strSub.replace(plain);		

		// Leemos el contenido del correo en formato HTML
		html   = SendHtmlEmail.fileToString(SendHtmlEmail.class.getResourceAsStream("/mail.html"), "utf-8");
		
		// Embebemos las imágenes que contendrá el correo (Para simplificar, el nombre de la variable 
		// que posteriormente será reemplazada, es igual al nombre de cada imagen real a embeber).
		String[] images = {"autentia.gif"};	
		URL 	 url = null;
		String	 cid = null; 
		for (int i = 0; i < images.length; i++){
			// Obtenemos la URL de la imagen desde el CLASSPATH
			url = SendHtmlEmail.class.getResource("/" + images[i]);
			cid = email.embed(url, images[i]);
			usuario.put(images[i],	cid);
		}
		
		// Ahora vamos a embeber una imagen pública de Internet. 
		cid = email.embed(new URL("https://adictosaltrabajo.com/images/logos/logo_adictos_3.jpg"), "pie");
		usuario.put("emailFoot",	cid);	// Le damos el nombre "emailFoot"
		
		// Usamos la clase StrSubstitutor del paquete "Commons Lang" para reemplazar las expresiones por su valor
		// http://commons.apache.org/lang/apidocs/index.html?org/apache/commons/lang/text/StrSubstitutor.html
		strSub = new StrSubstitutor(usuario);
		html   = strSub.replace(html);		
		

		// Cargamos la configuración del correo desde un archivo localizable via CLASSPATH
		Properties mailSetup = new Properties();
		mailSetup.load(SendHtmlEmail.class.getResourceAsStream("/mail.properties"));

		// Establecemos la configuracion del correo electrónico
		email.setHostName(mailSetup.getProperty("mail.server"));
		email.setCharset("UTF-8");
		email.addTo(usuario.getProperty("email"), usuario.getProperty("nombre"));
		email.setFrom(mailSetup.getProperty("from.email"), mailSetup.getProperty("from.name"));
		email.setSubject(mailSetup.getProperty("mail.subject"));		
		email.setHtmlMsg(html);
		email.setTextMsg(plain);

		// Enviamos el correo electrónico
		email.send();
	}

	/**
	 * Lee el contenido textual desde un stream de entrada
	 * @param  input Stream de entrada
	 * @param  encoding Codificación
	 * @return El contenido del stream de entrada
	 * @throws IOException Cualquier excepción de Entrada/Salida
	 */
	private static String fileToString(InputStream input, String encoding) throws IOException {
		StringWriter	  sw = new StringWriter();
		InputStreamReader in = new InputStreamReader(input, encoding);

		char[]	buffer = new char[1024 * 2];
		int		n	   = 0;
		while (-1 != (n = in.read(buffer))) {
			sw.write(buffer, 0, n);
		}    		
		return sw.toString();
	}	 
}

Captura a escala reducida del correo electrónico enviado:

Algunas Consideraciones:

Cuidado con el tipo de html que elegís pues para que se vea bien en el mayor número de visores de
correo electrónic deberéis usar un HTML "primitivo" evitando hojas de estilo
que no sean "inline" (hasta la fecha, sólo funcionan usando en el atributo style) y nada de lenguajes de scripting.

Un saludo.

Carlos García. Autentia.

cgpcosmad@gmail.com

3 COMENTARIOS

  1. Me parece muy interesante el tutorial que enviaste pero tengo una duda. Si yo tengo en mi outlook el nivel de seguridad estandar, es decir, que no descargue imagenes automaticamente en formato html o en elemenots RSS por defecto, cuando le llega un mail con imagenes embebidas (decodificadas a base 64) como el que nos adjuntas, las voy a ver? O tengo que cambiar algo en la política de seguridad de mi outlook?

    • Es la clase principal, si haces una copia de todo el código sin cambiar algo, no tendrás problemas.
      public class SendHtmlEmail {

      Saludos

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad