我正在使用Apache Commons Email API从我的应用程序发送电子邮件。我无法获得发送电子邮件的正确主题。例如,有问题的主题行:&#34; This is my email Subject line companyName<sup>®</sup>
&#34;。我期望主题行是&#34; I want something likewise - companyName®
&#34;但上标效应没有显示出来。
答案 0 :(得分:2)
主题行的呈现由电子邮件客户端执行;即电子邮件收件人用来阅读他/她邮件的工具。这些工具实现了一个名为RFC 822的标准,它规定了电子邮件的表示方例如电子邮件标题是什么,它们是什么意思,以及如何表示电子邮件的正文(内容)。
这是问题所在。 RFC 822是在1982年指定的。那是在Unicode之前的许多年。 RFC 822已更新几次,最新版本为RFC 5322。但是,RFC 5322仍然保留了电子邮件标题字段(例如“主题:”字段)必须由ASCII字符组成的约束。 (换句话说,直接在主题中使用UTF-8将违反规范。)
幸运的是有一种解决方法。 RFC 1342标准提供了一种语法,用于通过ASCII传递以另一种字符编码(例如UTF-8)编码的文本。 MIME规范已明确表示 您可以在电子邮件标题中使用RFC 1342编码。
RFC 1342编码的一般形式是:
=?charset?encoding?encoded-text?=
其中charset
是标准字符集名称,encoding
是Q
或B
(引用字符串或base64),encoded-text
是代表的文字在指定的字符集中,并使用指定的编码进行编码。例如:
=?utf-8?Q?hello?=
请参阅RFC以获取更多详细信息。
请注意,如果您使用javax.mail
API构建电子邮件,设置UTF-8编码电子邮件主题的正确方法如下:
message.setSubject("We love Java® !!", "UTF-8");
或使用Java的\uxxxx
Unicode转义。
不幸的是,Apache Commons Email API不允许您这样做。但是(如果我已正确读取代码),它将尝试使用电子邮件的字符集(请参阅setCharset()
)或默认字符集对包含非ASCII字符的标头字段进行编码。
因此,如果在使用Apache Commons Email API时未正确传递普通“®
”,则解决方案是使用setCharset("UTF-8")
来设置电子邮件的字符集。 (事实上,有证据表明该角色已被正确处理,因此这可能是多余的。)
解决了Unicode字符的问题。您还试图在“主题:”中包含HTML标记。据我所知,任何电子邮件规范都不支持邮件标题中的HTML标记。实际上,如果电子邮件 尝试在Subject:标题中呈现HTML标记,那么它可能会违反规范。
有一种替代方法,因为Unicode允许您修改字符以使其成为下标或上标;有关详细信息,请参阅this Wikipedia page。但是,您将受到收件人电子邮件客户端的Unicode呈现实现的支配。
答案 1 :(得分:0)
@stephen-c 答案是正确的,只是为了补充,我将分享我的部分代码。
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;
import javax.mail.Message;
import javax.mail.Session;
....
Message message = new MimeMessage(session);
String subject;
...
byte[] bytesEncoded = Base64.encodeBase64(subject.getBytes(StandardCharsets.UTF_8));
message.setSubject("=?UTF-8?B?" + new String(bytesEncoded) + "?=");