2013-02-07 42 views
22

我有一個需要發送確認電子郵件等的Tomcat應用程序。我用Javamail編寫了電子郵件(mail.jar)發送多部分文本/ html電子郵件。我基於Java EE示例上的代碼。我在本地服務器上使用SMTP MTA。最佳實踐 - 發送javamail mime multipart電子郵件 - 和gmail

它很好用。在Outlook中,我看到了HTML版本。如果我將它拖入Outlook垃圾郵件文件夾,我會看到文本版本。所以我解釋說,它說的是有效的。

但是,如果我在Gmail中查看電子郵件,則只能看到文本版本。我知道HTML就在那裏(這是Outlook從中得到的地方)。但Gmail沒有顯示它......我有很多來自其他系統的電子郵件,它們在Gmail中顯示爲HTML。

任何人都可以指向我顯示我失蹤的規格嗎?是否有我需要創建的特殊標題?

感謝

代碼如下所示:

Message message = new MimeMessage(session); 
Multipart multiPart = new MimeMultipart("alternative"); 

try { 

    MimeBodyPart textPart = new MimeBodyPart(); 
    textPart.setText(text, "utf-8"); 

    MimeBodyPart htmlPart = new MimeBodyPart(); 
    htmlPart.setContent(html, "text/html; charset=utf-8"); 

    multiPart.addBodyPart(htmlPart); 
    multiPart.addBodyPart(textPart); 
    message.setContent(multiPart); 

    if(from != null){ 
     message.setFrom(new InternetAddress(from)); 
    }else 
     message.setFrom(); 

    if(replyto != null) 
     message.setReplyTo(new InternetAddress[]{new InternetAddress(replyto)}); 
    else 
     message.setReplyTo(new InternetAddress[]{new InternetAddress(from)}); 

    InternetAddress[] toAddresses = { new InternetAddress(to) }; 
    message.setRecipients(Message.RecipientType.TO, toAddresses); 
    message.setSubject(subject); 
    message.setSentDate(new Date()); 

    Transport.send(message); 

} catch (AddressException e) { 
    e.printStackTrace(); 
    System.out.println("Error: "+e.getMessage()); 

} catch (MessagingException e) { 
    e.printStackTrace(); 
    System.out.println("Error: "+e.getMessage()); 

} finally {  
    System.out.println("Email sent!"); 
} 
+0

你的代碼看起來不錯。 Gmail可能會故意顯示純文本版本,以避免安全呈現html內容時出現的所有問題。給出一個選擇,它可能更喜歡純文本。 –

回答

51

解決了!看來根據多部分MIME規範,這些部分的順序很重要。應該從低保真度到高保真度的順序添加它們。所以看起來GMail遵循規範並使用最後一部分。在我的情況下,我有他們的HTML,文本。我剛換的以文本,HTML和Gmail正確呈現它...

MimeBodyPart textPart = new MimeBodyPart(); 
textPart.setText(text, "utf-8"); 

MimeBodyPart htmlPart = new MimeBodyPart(); 
htmlPart.setContent(html, "text/html; charset=utf-8"); 

multiPart.addBodyPart(textPart); // <-- first 
multiPart.addBodyPart(htmlPart); // <-- second 
message.setContent(multiPart); 

感謝您的幫助!

+0

感謝它很好,多年來解決了我的問題。另一個問題,如果我們需要使用數據處理程序將圖像添加到html內容,我們該怎麼辦? – serkan