Mejores prácticas: Envío de correos electrónicos multiparte javamail mime y gmail


Tengo una aplicación Tomcat que necesita enviar correos electrónicos de confirmación, etc. He codificado el correo electrónico con Javamail (mail.jar) para enviar correos electrónicos de texto/html de varias partes. Basé el código en los ejemplos de Java EE. Estoy usando el SMTP MTA en el servidor local.

Funciona muy bien. En Outlook, veo la versión HTML. Si lo arrastro a la carpeta de spam de Outlook, veo la versión de texto. Así que interpreto eso como diciendo que funciona.

Sin embargo, si veo los correos electrónicos en Gmail, solo veo el texto versión. Sé que el HTML está ahí (de ahí es de donde lo sacó Outlook). Pero Gmail no lo muestra... Tengo un montón de correos electrónicos de otros sistemas que se muestran como HTML en Gmail.

¿Alguien puede indicarme la especificación que muestra lo que me falta? ¿Hay encabezados especiales que necesito crear?

Gracias

El código se ve así:

Message message = new MimeMessage(session);
Multipart multiPart = new MimeMultipart("alternative");

try {

    MimeBodyPart textPart = new MimeBodyPart();
    textPart.setText(text, "utf-8");

    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent(html, "text/html; charset=utf-8");

    multiPart.addBodyPart(htmlPart);
    multiPart.addBodyPart(textPart);
    message.setContent(multiPart);

    if(from != null){
        message.setFrom(new InternetAddress(from));
    }else
        message.setFrom();

    if(replyto != null)
        message.setReplyTo(new InternetAddress[]{new InternetAddress(replyto)});
    else
        message.setReplyTo(new InternetAddress[]{new InternetAddress(from)});

    InternetAddress[] toAddresses = { new InternetAddress(to) };
    message.setRecipients(Message.RecipientType.TO, toAddresses);
    message.setSubject(subject);
    message.setSentDate(new Date());

    Transport.send(message);

} catch (AddressException e) {
    e.printStackTrace();
    System.out.println("Error: "+e.getMessage());

} catch (MessagingException e) {
    e.printStackTrace();
    System.out.println("Error: "+e.getMessage());

} finally {     
    System.out.println("Email sent!");
}
Author: PrecisionPete, 2013-02-07

1 answers

Resuelto! Parece que de acuerdo con la especificación MIME multipart, el orden de las partes es importante. Deben añadirse en orden de baja fidelidad a alta fidelidad. Así que parece GMail sigue la especificación y utiliza la última parte. En mi caso los tenía HTML, Texto. Acabo de cambiar el orden a Texto, HTML y Gmail lo hace correctamente...

Es decir,

MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(text, "utf-8");

MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(html, "text/html; charset=utf-8");

multiPart.addBodyPart(textPart); // <-- first
multiPart.addBodyPart(htmlPart); // <-- second
message.setContent(multiPart);

Gracias por la ayuda!

 54
Author: PrecisionPete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-05 01:24:48