最佳做法 - 发送 java 邮件哑剧多部分电子邮件 - 和 gmail

2022-09-01 10:31:53

我有一个Tomcat应用程序,需要发送确认电子邮件等。我已经使用Javamail(mail.jar)对电子邮件发送器进行了编码,以发送多部分文本/ html电子邮件。我基于 Java EE 示例编写代码。我在本地服务器上使用 SMTP MTA。

它工作得很好。在 Outlook 中,我看到 HTML 版本。如果我将其拖到Outlook垃圾邮件文件夹中,我会看到文本版本。所以我把它解释为说它有效。

但是,如果我在Gmail中查看电子邮件,则只能看到文本版本。我知道HTML就在那里(这就是Outlook从哪里得到的)。但是Gmail没有显示它...我有很多来自其他系统的电子邮件,这些电子邮件在Gmail中显示为HTML。

任何人都可以指点我到显示我缺少什么的规范吗?是否有我需要创建的特殊标头?

谢谢

代码如下所示:

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

答案 1

解决!根据多部分MIME规范,部分的顺序似乎很重要。它们应按从低保真到高保真的顺序添加。因此,似乎GMail遵循规范并使用最后一部分。在我的情况下,我有HTML,文本。我刚刚将顺序换成了文本,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);

感谢您的帮助!


答案 2

推荐