我有一个需要发送确认电子邮件等的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!");
}
答案 0 :(得分:54)
解决!似乎根据多部分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);
感谢您的帮助!