Javamail 更改主题行的字符集

2022-09-04 23:45:46

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

我试过甚至

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

但是它仍然以 Cp1252 的形式发送。来自邮件的示例标头如下所示:

有什么想法吗?

example from mail headers
(资料来源:friendfeed-media.com


答案 1

您应该使用 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"));`

答案 2

解决。

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

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

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

请参阅 https://www.rfc-editor.org/rfc/rfc2047


推荐