[英]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()
获取内容类型。
经过大量的研究和实验,我决定解决。 基本上有两个问题
字符集不应在MimeMessage级别设置,而应在单个MimeBodyPart级别设置。
将UTF-16更改为UTF-8。 某些电子邮件客户端/服务器无法正确处理UTF-16,或者未将其配置为处理UTF-16。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.