2017-03-01 169 views
1

我正在使用以下代碼向跨不同域的多個用戶發送郵件。使用javamail api發送的html電子郵件正文在outlook中出現亂碼

 String emailBody = "<html>Some html text goes here</html>" 
    String from = "[email protected]" 
    String bcc = "[email protected]" 
    String subject = "Some subject..." 
    List attachments = "Some image attachments ..." 
    MimeMessage message = new MimeMessage(session); 
    message.setHeader("Content-Type", "text/html; charset=UTF-16") 
    message.setHeader("Accept-Language", "en-US") 
    message.setHeader("Content-Language", "en-US") 

    message.setFrom(new InternetAddress(from)); 
    message.setRecipients(Message.RecipientType.BCC,InternetAddress.parse(bcc)); 
    message.setSubject(subject); 

    // creates message part 
    MimeBodyPart messageBodyPart = new MimeBodyPart(); 
    messageBodyPart.setContent(emailBody, "text/html; charset=UTF-16"); 

    // creates multi-part 
    Multipart multipart = new MimeMultipart(); 
    multipart.addBodyPart(messageBodyPart); 

    addAttachmentsToMultiPart(multipart,attachments) 

    message.setContent(multipart); 

    Transport.send(message); 

電子郵件正文全部是英文。但是很少有域名的用戶用中文字符接收。當我查看身體的html源代碼時,發現它部分是亂碼。一些原始html文本是完整的,並且在文本之間沒有特定順序的一些垃圾字符。此郵件通過此路徑「Tomcat應用程序 - >公司郵件服務器 - > outlook.office365.com服務器 - >目標郵件服務器 - >最終用戶Outlook客戶端」。

經過一番研究,我發現這個問題可能是由於字符編碼。爲了測試它,我試着將這封郵件發送到gamil.com。郵件正文在gmail中正確顯示,但我注意到在標題部分找到了以下標題,並且整個正文部分都以base64編碼。

Content-Type: text/html; charset="UTF-16" 
Content-Transfer-Encoding: base64 

我不知道如何在標題上設置「Content-Transfer-Encoding」,郵件正文在哪裏編碼。但是我在最終用戶郵件屬性中看不到類似的標題。我試着明確地設置「Content-Transfer-Encoding」爲「base64」,「quoted-printable」(和其他類型),但它總是被忽略,gmail總是以base64的形式接收它。此設置對最終用戶郵件沒有影響。他們總是收到相同的垃圾。

誰能幫我理解這可能是問題,以及如何解決它

回答

0

我經過大量的研究和實驗後解決了。基本上有兩個問題

  1. 字符集不應該的MimeMessage的水平,但在個別MimeBodyPart的級別設置。

  2. 將UTF-16更改爲UTF-8。某些電子郵件客戶端/服務器無法正確處理UTF-16,或者它們未配置爲處理UTF-16。

1

我們的代碼非常相似,你寫的東西,唯一的區別,你可以嘗試:

  • 我們不設置任何頭消息
  • 我們用一個稍微不同的主體內容類型 - text/html; charset=utf-8

順便說一句,我們使用com.google.common.net.MediaType將媒體類型傳遞到電子郵件發送類,那麼您可以使用MediaType.toString()來獲取內容類型。

相關問題