web-dev-qa-db-fra.com

Meilleures pratiques - Envoi de courriels multiparties javamail mime - et gmail

J'ai une application Tomcat qui doit envoyer des e-mails de confirmation, etc. J'ai codé l'e-mailer avec Javamail (mail.jar) pour envoyer des e-mails texte/html en plusieurs parties. J'ai basé le code sur les exemples Java EE. J'utilise le SMTP MTA sur le serveur local.

Cela fonctionne très bien. Dans Outlook, je vois la version HTML. Si je le fais glisser dans le dossier de spam Outlook, je vois la version texte. J'interprète donc cela comme disant que cela fonctionne.

Cependant, si je consulte les e-mails dans Gmail, je ne vois que la version texte. Je sais que le HTML est là (c'est d'où Outlook l'a obtenu). Mais Gmail ne le montre pas ... J'ai beaucoup d'e-mails provenant d'autres systèmes qui s'affichent en HTML dans Gmail.

Quelqu'un peut-il m'indiquer la spécification qui montre ce que je manque? Y a-t-il des en-têtes spéciaux que je dois créer?

Merci

Le code ressemble à ceci:

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!");
}
27
PrecisionPete

Résolu! Il semble que selon la spécification MIME en plusieurs parties, l'ordre des pièces est important. Ils doivent être ajoutés dans l'ordre de faible fidélité à haute fidélité. Il semble donc que GMail suit les spécifications et utilise la dernière partie. Dans mon cas, je les avais HTML, texte. Je viens d'échanger la commande en texte, HTML et Gmail la rend correctement ...

c'est à dire.

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);

Merci pour l'aide!

55
PrecisionPete