Envio de un Email con Texto, Html e Imagenes con javamail
Envio de un Email con Texto, Html e Imagenes con javamail
El siguiente procedimiento en java permite el envío de texto, un
mensaje en Html y adjuntar algunas images también como el de
de un logo adjunto al archivo de html.
En este caso por facilidad coloco el logotipo en un lugar que puede
accesar desde internet en este caso http://www.misitio/imagenes/logo.png
la ruta la puedo capturar simplemente dando click en el logo que deseo
colocar y capturando la ruta.
Luego diseño una página html que deseo empotrar en el email como una
variable String, en este caso hago el diseño sobre la variable correo
Defino el host , en mi caso estoy usando un servidor de correo local SendMail
lo defino local, luego asigno valores a las variables
to , para la dirección del correo donde deseo enviar el correo,
cc ,donde envio una copia(s) (en ese caso de varios los coloco
separados por punto y coma,
from , cuenta de correo desde donde envio el
correo .
Defino las variables que el javamail necesita para el despacho del correo.
Como simpre no voy a ser muy estricto en el uso del vocabulario técnico,
sino mas bien en el concepto general de el envio de un archivo con varios tipos
de contenidos.
El concepto básico es simple es armar unos "contenedores" que guardan
cada tipo de archivo, y luego esos "contenedores" guardardarlos en un gran
contenedor que los contiene y este es el que se publica.
En el caso que nos ocupa creo un contenedor que llamo cover , y sobre el
almaceno dos tipos de archivos:
uno que llamo text y otro que llamo html que se autodefininen y dicen lo que van a contener
El "contenedor" lo conformo con un MimeMultipart y el contenido con un MimeBodyPart
MimeMultipart cover = new MimeMultipart("alternative") ;
MimeBodyPart html = new MimeBodyPart() ;
MimeBodyPart text = new MimeBodyPart() ;
Agrego los contenidos que deseo enviar como texto y html a sus respectivas variables , dejando claro que correo es una variable String que va contener
infomación tipo hml, para evitar problemas en el despliegue del usuario es
mejor definir en esta , un codigo html bin conformado con todas las etiquetas
que sean necesarias, el Content-type, <htm>, <head>, <body> y demás y
tener mucho cuidado cn los <tr> <td> que nos pueden generar mas de un dolor
de cabeza, ya que dependiendo del navegar y el gestor de correos que pueden ser muy complacienten y entender no lo que dijimos sino lo que qusimos decir con otros no tendremos tanta suerte .
suerte
text.setText("Si no tiene html funcionado esto es lo que ve.");
html.setContent(correo, "text/html");
cover.addBodyPart(text) ;
cover.addBodyPart(html) ;
MimeBodyPart wrap = new MimeBodyPart() ;
wrap.setContent(cover) ;
Definimos los contenidos de las imagenes, indicando el sistema mediante FileDataSource en que
ruta plenamente cualificada donde están y les colocamos un titulo si desemoas y una descripción para orientar al usuario sino la colocamos no pasa nada, pero simpre es bueno infomar lo que se espera que se haga con las imagenes y como se llaman.
MimeBodyPart adjuntoSi = new MimeBodyPart() ;
adjuntoSi.setDataHandler(new DataHandler(new FileDataSource(gArchivoImagenSi))) ;
adjuntoSi.setFileName("Votar_Si") ;
adjuntoSi.setDescription("imagen_con_contenido_si") ;
MimeBodyPart adjuntoNo = new MimeBodyPart() ;
adjuntoNo.setDataHandler(new DataHandler(new FileDataSource(gArchivoImagenNo))) ;
adjuntoNo.setFileName("Votar_No") ;
adjuntoNo.setDescription("imagen_con_contenido_no") ;
Anexamos las imagenes al contenedor general y pulicamos el correo.
content.addBodyPart(adjuntoSi) ;
content.addBodyPart(adjuntoNo) ;
msg.setContent(content) ;
Como se ve almacenamos los contenidos de texto y html que queremos enviar
en este contenedor y agregamos en este el contendor wrap que contiene a cover
que a su vez contiene el mensaje de texto y html.
procedimiento Java,
---------------------------------------------------------------------------------------------------------------------------
/* Calculo de la URL para poder desplegar imagenes en el
correo de forma dinamica
logos, QR, codigos de barras etc
la url retorna un string de la forma http://misitio/
Esto facilita la migracion del sitio sin tener que modificar
el código
Esto es útil porque aveces necesitamos ubicar un logotipo que
está por ejemplo en /misitio/imagenes , pero al llenar el correo
cuando va a despleglar el logo no lo encuentra, porque la dirección
de la imagen está es una URL que el correo no puede interpretar
Un pequeño truco es usar los comandos
request.getRequestURL().toString()
request.getServletPath()
Al hacer la resta logica de estos dos String nos queda la dirección
del sitio que es lo que queremos.
y agregar el nombre de la imagen por ejemplo suponiendo que la
imagen de interes logo.png esta en la carpeta imagenes tenemos que
la url de la imgen es url += "imagenes/logo.png"
*/
String url = request.getRequestURL().toString() ;
String path = request.getServletPath() ;
url = substring(url,1,url.indexOf(path)) ;
String gArchivoImagenSi = "../imagenes/EleccionSi.jpeg" ;
String gArchivoImagenNo = "../imagenes/EleccionNo.jpeg" ;
String logoEmpresa = url + "imagenes/logo.png" ;
String gEmpresaEmail = "miEmpresa@gmail.com" ;
String gEmpresaNombre = "MI EMPRESA" ;
String gEmail = "atucorreo@gmail.com" ;
String gCCEmail = "copiacorreo@gmail.com" ;
String host = "localhost" ;
boolean sessionDebug = false ;
String to = gEmail ;
String cc = gCCEmail ;
String from = gMIEmail ;
String subject = gEmpresaNombre ;
subject += "Mi mensaje a enviar. " ;
String correo = new String() ;
/* Aqui defino el código html que deseo empotrar en mi email */
correo = "<html>" ;
correo += " <head>" ;
/* No es indisipensable el content-type pero algunos gestores de
correo se ponen recalcitrantes sino aparece y desconfiguran la
página presentandola como solo texto
*/
correo += "<meta http-equiv='content-type' content='text/html; charset=UTF-8'>";
correo += " </head>" ;
correo += " <body>" ;
correo += "<center>" ;
correo += "<br>" ;
correo += " <table bgcolor=#ffffbb border=0>" ;
correo += " <tr>" ;
correo += " <td align=left colspan=2>" ;
correo += " <img width=30%' height='30%' src='" ;
correo += logoEmpresa + "'/>" ;
correo += " </td>" ;
correo += " </tr>"
correo += " <tr>" ;
correo += " <td align=center>" ;
correo += " <font color=blue>" ;
correo += " Si no ve la imagen , activar <br>" ;
correo += " ver imágenes en su navegador" ;
correo += " </font>" ;
correo += " </td>" ;
correo += " </tr>" ;
correo += " </table>" ;
correo += "</body>" ;
correo += "</html>" ;
/* termino de definir el códogo html */
Properties props = System.getProperties() ;
props.put("mail.host", host)
;
props.put("mail.transport.protocol", "smtp") ;
Session mailSession = Session.getDefaultInstance(props, null) ;
mailSession.setDebug(sessionDebug) ;
MimeMessage msg = new MimeMessage(mailSession) ;
msg.setFrom(new InternetAddress(from)) ;
InternetAddress[] address = {new InternetAddress(to)} ;
msg.setRecipients(Message.RecipientType.TO,address) ;
InternetAddress[] addressCC = {new InternetAddress(cc)} ;
msg.setRecipients(Message.RecipientType.CC,addressCC) ;
msg.setSentDate(new Date()) ;
msg.setSubject(subject,"UTF-8") ;
msg.setDescription("Ejemplo;Estas imagen son para descargar" ) ;
MimeBodyPart wrap = new MimeBodyPart() ;
MimeMultipart cover = new MimeMultipart("alternative") ;
MimeBodyPart html = new MimeBodyPart() ;
MimeBodyPart text = new MimeBodyPart() ;
text.setText("Si no tiene html funcionado esto es lo que ve.") ;
html.setContent(correo, "text/html") ;
cover.addBodyPart(text) ;
cover.addBodyPart(html) ;
wrap.setContent(cover) ;
MimeMultipart content = new MimeMultipart("related") ;
content.addBodyPart(wrap) ;
MimeBodyPart adjuntoSi = new MimeBodyPart() ;
adjuntoSi.setDataHandler(new DataHandler(new FileDataSource(gArchivoImagenSi))) ;
adjuntoSi.setFileName("Votar_Si") ;
adjuntoSi.setDescription("imagen_con_contenido_si") ;
MimeBodyPart adjuntoNo = new MimeBodyPart() ;
adjuntoNo.setDataHandler(new DataHandler(new FileDataSource(gArchivoImagenNo))) ;
adjuntoNo.setFileName("Votar_No") ;
adjuntoNo.setDescription("imagen_con_contenido_no") ;
content.addBodyPart(adjuntoSi) ;
content.addBodyPart(adjuntoNo) ;
//------------------------------------------------------------------------------------------
msg.setContent(content) ;
Comentarios
Publicar un comentario