我使用以下代码向不同域中的多个用户发送邮件。
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接收。此设置对最终用户邮件没有影响。他们总是收到同样的垃圾。
任何人都可以帮助我了解可能存在的问题以及如何解决问题
答案 0 :(得分:2)
我们的代码与您所编写的代码非常相似,您可以尝试的唯一区别是:
text/html; charset=utf-8
另外,我们使用com.google.common.net.MediaType
将媒体类型传递到电子邮件发送类,因此您可以使用MediaType.toString()
来获取内容类型。
答案 1 :(得分:0)
字符集不应设置为MimeMessage级别,而应设置为单独的MimeBodyPart级别。
将UTF-16更改为UTF-8。某些电子邮件客户端/服务器无法正确处理UTF-16,或者未配置为处理UTF-16。