2008-11-26 143 views
18

我试图用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中显示?

+0

我用一个新想法更新了我的答案。 – erickson 2008-11-27 16:55:40

+0

@erickson:对你的回答满意是从我;) – 2010-05-18 15:06:28

回答

16

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

首先,我不推荐直接使用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中的设置,但我找不到它...

3
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 & @埃里克森的答案(天啊,我必须键入慢),使用方法:

MimeMultipart content = new MimeMultipart("alternative") 
+0

这确实是一个问题。它返回“text/plain”。所以我做了调整,但我仍然得到同样的问题... 好抓! – 2008-11-26 22:08:55

1

你应该看看收到的邮件的来源:是的内容类型消息multipart/alternative?

5

除了去除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回归纯文本。

0

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]

3

更改为:

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"); 
1
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1"); 

应该解决您的问题(去除\"字符)。

2

我用下面的代码:

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

现在,展望显示在HTML格式。

相关问题