Javamail改变了主题行的字符集

Ahm*_*gle 11 java jakarta-mail character-encoding

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

我甚至试过了

mail.setSubject(new String(subject.getBytes("utf-8"), "utf-8"));
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

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

Mic*_*zka 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]);
Run Code Online (Sandbox Code Playgroud)

MimeUtility中,据说:

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

从我的角度来看,Message.setSubject应该是这个目的的切入点.

cp1252在你的主题编码显示出来,因为它是你的平台上的标准编码.

您发布的示例是"结果"

mail.setSubject(MimeUtility.encodeText(subject, "cp1252", "Q"));`
Run Code Online (Sandbox Code Playgroud)

  • 消息不包含setSubject(String,String),而MimeMessage则包含. (4认同)

Ahm*_*gle 23

解决了.

mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B"));
Run Code Online (Sandbox Code Playgroud)

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

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

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