Подтвердить что ты не робот

Лучшие практики - отправка многоадресных писем javamail mime - и gmail

У меня есть приложение Tomcat, которому необходимо отправить электронные письма с подтверждением и т.д. Я отправил почтовое сообщение с помощью Javamail (mail.jar) для отправки многостраничных текстовых/html-сообщений. Я основал код на примерах Java EE. Я использую SMTP MTA на локальном сервере.

Он отлично работает. В Outlook я вижу версию HTML. Если я перетащил его в папку спама Outlook, я увижу текстовую версию. Поэтому я интерпретирую это, говоря, что это работает.

Однако, если я просматриваю письма в Gmail, я вижу только текстовую версию. Я знаю, что там есть HTML (откуда Outlook получил его). Но Gmail не показывает это... У меня много писем из других систем, которые отображаются как HTML в Gmail.

Может ли кто-нибудь указать мне на спецификацию, которая показывает, что мне не хватает? Существуют ли специальные заголовки, которые мне нужно создать?

Спасибо

Код выглядит следующим образом:

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!");
}
4b9b3361

Ответ 1

Решено! Кажется, что в соответствии с спецификацией multipart MIME, порядок деталей важен. Их следует добавлять в порядке от низкой точности к высокой точности. Так что GMail следует спецификации и использует последнюю часть. В моем случае у меня были HTML, Text. Я просто поменял порядок на текст, HTML и Gmail правильно отображает его...

то есть.

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

Спасибо за помощь!