如何将HTML电子邮件发送到Java的Outlook
我试图用HTML格式发送电子邮件使用JavaMail,但它似乎总是只显示为Outlook中的文本电子邮件。如何将HTML电子邮件发送到Java的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中显示?
经过大量的调查,我已经能够取得一些重大进展。
首先,我不推荐直接使用JavaMail,而是使用Jakarta Commons Email库。这非常简化了这个问题!
现在的代码是:
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中的设置,但我找不到它...
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 & @埃里克森的答案(天啊,我必须键入慢),使用方法:
MimeMultipart content = new MimeMultipart("alternative")
这确实是一个问题。它返回“text/plain”。所以我做了调整,但我仍然得到同样的问题... 好抓! – 2008-11-26 22:08:55
你应该看看收到的邮件的来源:是的内容类型消息multipart/alternative?
除了去除html.setHeader("Content-Type", html.getContentType())
呼叫作为建议了,我会更换行:
MimeMultipart content = new MimeMultipart();
…具有:
MimeMultipart content = new MimeMultiPart("alternative");
…去除行:
message.setHeader("Content-Type" , content.getContentType());
默认的MimeMultiPart构造函数可能是causi “多部分/混合”内容类型的问题。
当使用multipart/alternative时,替代品的排列顺序是它们对原始材料的忠实度,最后的再现效果最好。但是,即使HTML存在,客户端通常也允许用户显示纯文本。您确定此选项在Outlook中未启用吗?其他用户代理(如Thunderbird或GMail)如何处理您的消息?
另外,确保HTML格式正确。我会用W3 validation service验证HTML内容,并可能将其保存到一个文件中,并使用不同版本的IE浏览它。也许这里存在一个缺陷,导致Outlook回归纯文本。
workaroung解决方案outlook 2003:此消息使用不受Internet服务支持的字符集。无法正确显示。
这可能是由于编码。大多数HTML网页使用ISO-8859-1没有CP-1252尝试改变
例如,你的代码是:
message.setContent(sBuffer.toString(), "text/html");
更改为:
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\"");
这将引发新的checked异常:java.io.UnsupportedEncodingException,所以你需要声明它被抛出或捕获它。 iso-8859-1被支持,所以除非有东西被你的rt.jar破坏,否则这个异常将永远不会被抛出。
问候, Javeed [email protected]
更改为:
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\"");
内容字符集需要进行设置,我不明白为什么内容本身。 而应是:
message.setContent(sBuffer.toString(), "text/html;charset=iso-8859-1");
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1");
应该解决您的问题(去除\"
字符)。
我用下面的代码:
mimeBodyPart1.setDataHandler(new DataHandler(new ByteArrayDataSource(messageBody, "text/html; charset=utf-8")));
multiPart.addBodyPart(mimeBodyPart1);
message.setContent(multiPart, "text/html; charset=utf-8");
现在,展望显示在HTML格式。
我用一个新想法更新了我的答案。 – erickson 2008-11-27 16:55:40
@erickson:对你的回答满意是从我;) – 2010-05-18 15:06:28