我正在使用以下代碼向跨不同域的多個用戶發送郵件。使用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的形式接收它。此設置對最終用戶郵件沒有影響。他們總是收到相同的垃圾。
誰能幫我理解這可能是問題,以及如何解決它