【问题标题】:Best Practices - Sending javamail mime multipart emails - and gmail最佳实践 - 发送 javamail mime 多部分电子邮件 - 和 gmail
【发布时间】:2013-01-22 13:03:33
【问题描述】:

我有一个需要发送确认电子邮件等的 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!");
}

【问题讨论】:

  • 您的代码看起来不错。 Gmail 可能故意显示纯文本版本,以避免安全呈现 html 内容的所有问题。如果有选择,它可能更喜欢纯文本。

标签: java tomcat smtp jakarta-mail html-email


【解决方案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);

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 2010-12-10
    • 2020-06-30
    • 2022-08-14
    • 2011-02-16
    • 1970-01-01
    • 2011-07-08
    • 2010-12-20
    • 2011-08-20
    • 2019-06-26
    相关资源
    最近更新 更多