使用javamail api发送的html电子邮件正文在outlook中显示为乱码

使用javamail api发送的html电子邮件正文在outlook中显示为乱码,java,email,outlook,smtp,office365,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 att

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

        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);
我不确定如何在邮件头上设置“内容传输编码”,以及邮件正文在哪里编码。但我在最终用户邮件属性中没有看到类似的标题。我曾尝试将“内容传输编码”显式设置为“base64”、“quoted printable”(和其他类型),但它总是被忽略,gmail总是将其作为base64接收。此设置对最终用户邮件没有影响。他们总是收到同样的垃圾


有谁能帮助我了解可能出现的问题以及如何解决它

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

  • 我们不在邮件中设置任何标题
  • 我们使用稍微不同的body内容类型-
    text/html;字符集=utf-8

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

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

  • 我们不在邮件中设置任何标题
  • 我们使用稍微不同的body内容类型-
    text/html;字符集=utf-8

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

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

  • 字符集不应设置在MimeMessage级别,而应设置在单个MimeBodyPart级别

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


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

  • 字符集不应设置在MimeMessage级别,而应设置在单个MimeBodyPart级别

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

  • Content-Type: text/html; charset="UTF-16"
    Content-Transfer-Encoding: base64