如何才能将HTML效果纳入电子邮件的主题行?

时间:2015-11-25 10:43:48

标签: email html-email

我正在使用Apache Commons Email API从我的应用程序发送电子邮件。我无法获得发送电子邮件的正确主题。例如,有问题的主题行:&#34; This is my email Subject line companyName<sup>®</sup>&#34;。我期望主题行是&#34; I want something likewise - companyName®&#34;但上标效应没有显示出来。

2 个答案:

答案 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是标准字符集名称,encodingQB(引用字符串或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) + "?=");