使用javamail api发送的html电子邮件正文在outlook中出现乱码

时间:2017-03-01 17:16:32

标签: java email outlook smtp office365

我使用以下代码向不同域中的多个用户发送邮件。

        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应用程序 - &gt;公司邮件服务器 - &gt; outlook.office365.com服务器 - &gt;目标邮件服务器 - &gt;最终用户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接收。此设置对最终用户邮件没有影响。他们总是收到同样的垃圾。

任何人都可以帮助我了解可能存在的问题以及如何解决问题

2 个答案:

答案 0 :(得分:2)

我们的代码与您所编写的代码非常相似,您可以尝试的唯一区别是:

  • 我们不会在消息中设置任何标题
  • 我们使用略有不同的正文内容类型 - text/html; charset=utf-8

另外,我们使用com.google.common.net.MediaType将媒体类型传递到电子邮件发送类,因此您可以使用MediaType.toString()来获取内容类型。

答案 1 :(得分:0)

经过大量的研究和实验,我解决了这个问题。基本上有两个问题

  1. 字符集不应设置为MimeMessage级别,而应设置为单独的MimeBodyPart级别。

  2. 将UTF-16更改为UTF-8。某些电子邮件客户端/服务器无法正确处理UTF-16,或者未配置为处理UTF-16。