我正在以这种方式发送电子邮件:
@Test
public void testEmailCharacterSet() throws MessagingException, UnsupportedEncodingException {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setDefaultEncoding("utf-8");
mailSender.setHost("*****");
mailSender.setUsername("*****");
mailSender.setPassword("*****");
Properties properties = new Properties();
properties.setProperty("mail.mime.charset", "utf-8");
mailSender.setJavaMailProperties(properties);
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, false, "utf-8");
mimeMessage.setContent("Árvíztűrő tükörfúrógép 3", "text/html");
helper.setFrom("noreply@foobar.com");
helper.setTo("foobar@gmail.com");
mailSender.send(mimeMessage);
}
如您所见,我尽可能在所有地方设置 utf-8。我的问题是传出的原始字节仍然是 Latin1,至少这是我在 Wireshark 中看到的:
Date: Sun, 17 May 2015 18:16:21 +0200 (CEST)
From: noreply@foobar.com
To: foobar@gmail.com
Message-ID: <13648335.0.1431879381653.JavaMail.foo@foo-dell>
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
=C1rv=EDzt?r? t=FCk=F6rf=FAr=F3g=E9p 3
.
所以基本上标题是 UTF-8,但输出字节已经包含问号,其中 ő 和 ű 应该出现,这是 Latin1 中缺少的两个字符。 JVM 的 file.encoding
不是 UTF-8,但我正在寻找一种方法来保持它的原样并仅在电子邮件方面解决这个问题。
谢谢!
更新
我以前曾成功地使用普通的旧方法发送电子邮件,有趣的是它仍然有效:
Message mimeMessage = new MimeMessage(session);
mimeMessage.setContent("Árvíztűrő tükörfúrógép 7 oldschool", "text/html; charset=utf-8");
所以它显然是特定于 JavaMailSenderImpl
的东西。
最佳答案
如果你添加这行:
properties.setProperty("mail.smtp.allow8bitmime", "true");
properties.setProperty("mail.smtps.allow8bitmime", "true");
对于您的代码,消息将具有 Content-Transfer-Encoding: header 设置为 8bit 并且邮件将是可读的。
关于java - 如何使用 JavaMailSenderImpl 发送 UTF-8 编码的电子邮件正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30289458/