Javamail更改主题行的字符集

Javamail更改主题行的字符集,java,character-encoding,jakarta-mail,Java,Character Encoding,Jakarta Mail,我正在使用Javamail(javax.mail)发送邮件。我成功地将邮件内容调整为utf-8。但是,我无法将主题行设置为utf-8编码字符串 我甚至试过了 mail.setSubject(new String(subject.getBytes("utf-8"), "utf-8")); 但在主题上,它仍然作为Cp1252发送。邮件标题示例如下所示: 有什么想法吗 (来源:)已解决 mail.setSubject(MimeUtility.encodeTe

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

我甚至试过了

mail.setSubject(new String(subject.getBytes("utf-8"), "utf-8"));
但在主题上,它仍然作为Cp1252发送。邮件标题示例如下所示:

有什么想法吗


(来源:)

已解决

mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B"));
解决该问题并发送utf-8编码邮件主题\n/

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

为此,您应该使用一个方便的函数

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]);
据说:

根据RFC 2047,有一组方法可以对MIME头进行编码和解码。注意,一般来说,在使用setSubject和setRecipients等方法时不需要这些方法;当使用这些“高级”方法时,JavaMail将自动编码和解码数据。只有在使用setHeader和getHeader方法手动上载原始MIME头时,才需要以下方法

在我看来,
Message.setSubject
应该是这个目的的入口点

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]);
显示主题编码中的
cp1252
,因为它是您平台上的标准编码

您发布的示例是

问题解决了

mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B"));
解决该问题并发送utf-8编码邮件主题


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

我在使用Java Mail的Apache Camel Mail中遇到了类似的问题。背景

exchange.setProperty(exchange.CHARSET_名称,“UTF-8”)

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

此方法将解决问题: mimeMsg.setSubject(主题“utf-8”)

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

问题已解决

mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B"));
导入静态java.nio.charset.StandardCharsets.*;
byte[]bytes=subject.getBytes(ISO_8859_1);
主题=新字符串(字节,UTF_8);
mail.setSubject(主题);

有趣的是,我的mimessage没有setSubject(String,String)。也许我使用的是旧版本的Javamail。无论如何,谢谢。那一定是一个非常古老的javamail,因为即使是1999年的[1.1][1]版中的[MimeMessage]也有它[1] :Message不包含setSubject(String,String),而mimessage包含setSubject。什么是“交换”?