我有一个 Tomcat 应用程序需要发送确认电子邮件等。我已经使用 Javamail (mail.jar) 对电子邮件程序进行了编码以发送多部分文本/html 电子邮件。我的代码基于 Java EE 示例。我在本地服务器上使用 SMTP MTA。
效果很好。在 Outlook 中,我看到 HTML 版本。如果我将其拖到 Outlook 垃圾邮件文件夹中,我会看到文本版本。所以我将其解释为说它有效。
但是,如果我在 Gmail 中查看电子邮件,我只能看到文本版本。我知道 HTML 就在那里(Outlook 就是从那里获取它的)。但 Gmail 没有显示它...我有很多来自其他系统的电子邮件在 Gmail 中显示为 HTML。
谁能指出我所缺少的规范?我需要创建特殊的标头吗?
Thanks
代码如下所示:
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!");
}
解决了!根据多部分 MIME 规范,各部分的顺序似乎很重要。应按照从低保真度到高保真度的顺序添加它们。所以看起来 GMail 遵循规范并使用最后一部分。就我而言,我有 HTML、文本。我刚刚将顺序交换为文本,HTML 和 Gmail 正确呈现了它......
i.e.
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);
谢谢您的帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)