Javamail改变了主题行的字符集

我正在使用Javamail(javax.mail)发送邮件。 我成功调整了邮件内容为utf-8。 但是我无法将主题行设置为utf-8编码的字符串。

我甚至试过了

mail.setSubject(new String(subject.getBytes("utf-8"), "utf-8")); 

然而它仍然作为Cp1252发送。 邮件的示例标题如下:

有任何想法吗?

来自邮件标题的示例http://m.friendfeed-media.com/a328a80db12f3c17a8aed06be106045354355abf

您应该使用setSubject(String subject,String charset) ,这是一个方便的function。

 Session session=Session.getDefaultInstance(new Properties()); MimeMessage mimeMsg= new MimeMessage(session); String subject="Herr Müller reist nach \u0141\u00f3d\u017a."; mimeMsg.setSubject(subject,"utf-8"); System.out.println(subject); System.out.println(mimeMsg.getHeader("Subject")[0]); 

在MimeUtility中 ,据说:

根据RFC 2047,有一组编码和解码MIME头的方法。注意,通常,在使用setSubject和setRecipients等方法时不需要这些方法。 使用这些“更高级别”方法时,JavaMail将自动对数据进行编码和解码。 只有在使用setHeader和getHeader方法编写原始MIME头文件时才需要使用以下方法。

从我的角度来看, Message.setSubject应该是此目的的入口点。

主题编码中的cp1252显示,因为它是您平台上的标准编码。

您发布的示例是“结果”

 mail.setSubject(MimeUtility.encodeText(subject, "cp1252", "Q"));` 

解决了。

 mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B")); 

解决它并发送utf-8编码的邮件主题。 \ n /

“编码”的合法值是“Q”和“B”……当要编码的大多数字符都是ASCII字符集时,建议使用“Q”编码; 否则,应使用“B”编码。

见http://tools.ietf.org/html/rfc2047 。

问题解决了!

 mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B")); 

解决它并发送utf-8编码的邮件主题。

为什么有“B”为什么没有ISO的东西?

我遇到了使用Java Mail的Apache Camel Mail的类似问题。 设置

exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8");

在路由到SMTP之前,解决了问题。