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&aacute;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

Entradas populares