如何从Java发送html电子邮件到Outlook

我正在尝试使用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中显示?

经过大量调查,我已经取得了一些重大进展。

首先,我建议使用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中的一个设置,但我找不到它……

除了删除html.setHeader("Content-Type", html.getContentType())调用之外,我还要替换这行:

 MimeMultipart content = new MimeMultipart(); 

…有:

 MimeMultipart content = new MimeMultiPart("alternative"); 

…并删除该行:

 message.setHeader("Content-Type" , content.getContentType() ); 

默认的MimeMultiPart构造函数可能导致“multipart / mixed”内容类型出现问题。

当使用多部分/替代品时,替代品的排序方式是他们对原作的忠诚度,最佳的再现性。 但是,客户端通常会为用户提供显示纯文本的选项,即使存在HTML也是如此。 您确定Outlook中未启用此选项吗? 其他用户代理(如Thunderbird或GMail)如何处理您的邮件?

此外,确保HTML格式正确。 我将使用W3validation服务validationHTML内容,并可能将其保存到文件中,并使用不同版本的IE查看它。 也许有一个缺陷导致Outlook回归纯文本。

 html.setContent(htmlBody, "text/html"); html.setHeader("MIME-Version" , "1.0" ); html.setHeader("Content-Type" , html.getContentType() ); 

setContentsetHeader("Content-Type", String)做同样的事情 – html.getContentType()是否可能返回text/html以外的东西?

根据评论和@PhilLho和@ erickson的回答进行扩展(geez,我必须慢慢输入),使用:

 MimeMultipart content = new MimeMultipart("alternative") 

将此更改为:

 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"); 

我使用了以下代码:

 mimeBodyPart1.setDataHandler(new DataHandler(new ByteArrayDataSource(messageBody, "text/html; charset=utf-8"))); multiPart.addBodyPart(mimeBodyPart1); message.setContent(multiPart, "text/html; charset=utf-8"); 

现在, Outlookhtml格式显示。

您应该查看收到的消息的来源:是消息multipart / alternative的Content-Type?

 message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1"); 

应该解决你的问题(删除\"字符)。

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\""); 

这会抛出一个新的已检查exception:java.io.UnsupportedEncodingException,因此您需要声明它被抛出或捕获它。 支持iso-8859-1,除非rt.jar损坏了某些内容,否则永远不会抛出exception。

此致,Javeed javeed.mca@gmail.com