Javamail改变了主题行的字符集

时间:2010-08-10 16:36:23

标签: java character-encoding javamail

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

我甚至试过

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

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

有什么想法吗?

example from mail headers http://m.friendfeed-media.com/a328a80db12f3c17a8aed06be106045354355abf

6 个答案:

答案 0 :(得分:26)

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

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"));`

答案 1 :(得分:23)

解决。

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

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

  

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

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

答案 2 :(得分:2)

问题解决了!

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

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

为什么有“B”为什么没有ISO-something?

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

MimeMessage.setSubject(String subject, String charset)方法将解决此问题: mimeMsg.setSubject(subject,“ utf-8”);

这是一个更新的链接。 Oracle收购Sun之后,Oracle取消了以前的文档链接。

答案 5 :(得分:0)

已解决。

None