java - 如何使用 JavaMailSenderImpl 发送 UTF-8 编码的电子邮件正文?

标签 java email encoding utf-8

我正在以这种方式发送电子邮件:

@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/

相关文章:

java - 字符串编码不输出所有字符

php - Utf-8 编码不适用于使用 php 5.5 的 utf-8 编码文档

java - 在 JSP 中获取当前文件名

java - 从逗号分隔的文本文件中读取

java - 如何获取引发自定义异常的类的名称

c# - 如何使用正则表达式验证单字母域名?

php - 使 PHP 的 mail() 异步

encoding - 表情符号值范围

java - 为什么 Vaadin 8 ComboBox 添加额外的空项目

php - PHP邮件功能无法完成电子邮件的发送