繁体   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