我试图用JavaMail发送一封html格式的电子邮件,但在Outlook中似乎总是只显示为文本电子邮件。
下面是我的代码:
try
{
Properties props = System.getProperties();
props.put("mail.smtp.host", mailserver);
props.put("mail.smtp.from", fromEmail);
props.put("mail.smtp.auth", authentication);
props.put("mail.smtp.port", port);
Session session = Session.getDefaultInstance(props, null);
// -- Create a new message --
MimeMessage message = new MimeMessage(session);
// -- Set the FROM and TO fields --
message.setFrom(new InternetAddress(fromEmail, displayName));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
MimeMultipart content = new MimeMultipart();
MimeBodyPart text = new MimeBodyPart();
MimeBodyPart html = new MimeBodyPart();
text.setText(textBody);
text.setHeader("MIME-Version" , "1.0" );
text.setHeader("Content-Type" , text.getContentType() );
html.setContent(htmlBody, "text/html");
html.setHeader("MIME-Version" , "1.0" );
html.setHeader("Content-Type" , html.getContentType() );
content.addBodyPart(text);
content.addBodyPart(html);
message.setContent( content );
message.setHeader("MIME-Version" , "1.0" );
message.setHeader("Content-Type" , content.getContentType() );
message.setHeader("X-Mailer", "My own custom mailer");
// -- Set the subject --
message.setSubject(subject);
// -- Set some other header information --
message.setSentDate(new Date());
// INFO: only SMTP protocol is supported for now...
Transport transport = session.getTransport("smtp");
transport.connect(mailserver, username, password);
message.saveChanges();
// -- Send the message --
transport.sendMessage(message, message.getAllRecipients());
transport.close();
return true;
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
throw e;
}
你知道为什么html版的电子邮件不会在Outlook中显示吗?
发布于 2008-11-27 20:33:40
经过大量的调查,我已经取得了一些重大的进展。
首先,我建议使用Jakarta Commons Email库,而不是直接使用JavaMail。这确实大大简化了问题!
代码现在是:
HtmlEmail email = new HtmlEmail();
email.setHostName(mailserver);
email.setAuthentication(username, password);
email.setSmtpPort(port);
email.setFrom(fromEmail);
email.addTo(to);
email.setSubject(subject);
email.setTextMsg(textBody);
email.setHtmlMsg(htmlBody);
email.setDebug(true);
email.send();
说起来很简单。
然而,仍然有一个问题。html版本的电子邮件在Gmail、Hotmail等中运行良好,但在Outlook中仍然不能正确显示。它总是想要显示文本版本,我不知道为什么。我怀疑这是Outlook中的设置,但我找不到它...
发布于 2008-11-26 22:42:58
除了已经建议的删除html.setHeader("Content-Type", html.getContentType())
调用之外,我还替换了下面这一行:
MimeMultipart content = new MimeMultipart();
…通过以下方式:
MimeMultipart content = new MimeMultiPart("alternative");
…并删除行:
message.setHeader("Content-Type" , content.getContentType() );
默认的MimeMultiPart构造函数可能会导致“多部分/混合”内容类型的问题。
当使用multipart/alternative时,备选方案根据它们对原始方案的忠诚度进行排序,最佳再现在最后。但是,客户端通常会为用户提供显示纯文本的选项,即使存在HTML也是如此。是否确实未在Outlook中启用此选项?其他用户代理,如雷鸟或GMail,如何处理您的消息?
此外,还要确保HTML是格式良好的。我会用W3 validation service验证超文本标记语言的内容,可能还会把它保存到一个文件中,然后用不同版本的IE查看。也许那里有一个缺陷,导致Outlook回退到纯文本。
发布于 2008-11-26 22:03:40
html.setContent(htmlBody, "text/html");
html.setHeader("MIME-Version" , "1.0" );
html.setHeader("Content-Type" , html.getContentType() );
setContent
和setHeader("Content-Type", String)
做同样的事情--有没有可能html.getContentType()
返回的不是text/html
根据评论和@PhilLho &@erickson的答案展开(天哪,我必须慢慢输入),使用:
MimeMultipart content = new MimeMultipart("alternative")
https://stackoverflow.com/questions/322298
复制相似问题