2008-11-26 101 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格式。