簡體   English   中英

使用javamail api發送的html電子郵件正文在Outlook中顯示為亂碼

[英]html email body sent using javamail api appears garbled in outlook

我正在使用下面的代碼將郵件發送到不同域中的多個用戶。

        String emailBody = "<html>Some html text goes here</html>"
    String from = "from@domain1.com"
    String bcc = "bcc@domain2.com"
    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。 而且此設置對最終用戶的郵件沒有影響。 他們總是收到同樣的垃圾。

誰能幫助我了解可能出現的問題以及如何解決

我們提供的代碼與您編寫的代碼非常相似,只是可以嘗試的不同之處:

  • 我們沒有在郵件中設置任何標題
  • 我們使用稍微不同的正文內容類型text/html; charset=utf-8 text/html; charset=utf-8

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

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

  1. 字符集不應在MimeMessage級別設置,而應在單個MimeBodyPart級別設置。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM