Email 如何在电子邮件中使用HTML';你的主题是什么?

Email 如何在电子邮件中使用HTML';你的主题是什么?,email,html-email,Email,Html Email,我正在使用Apache Commons电子邮件API从我的应用程序发送电子邮件。我无法获得发送电子邮件的适当主题行。例如,有问题的主题行:“这是我的电子邮件主题行companyName®”。我希望主题行是“我想要类似的东西-companyName®”,但上标效果没有显示。主题行的呈现由电子邮件客户端执行;i、 e.电子邮件收件人用来阅读其邮件的工具。这些工具实现了一个名为RFC 822的标准,该标准指定了电子邮件的表示方式;e、 g.电子邮件标题是什么,它们的含义是什么,以及电子邮件的正文(内容

我正在使用Apache Commons电子邮件API从我的应用程序发送电子邮件。我无法获得发送电子邮件的适当主题行。例如,有问题的主题行:“
这是我的电子邮件主题行companyName®
”。我希望主题行是“
我想要类似的东西-companyName®
”,但上标效果没有显示。

主题行的呈现由电子邮件客户端执行;i、 e.电子邮件收件人用来阅读其邮件的工具。这些工具实现了一个名为RFC 822的标准,该标准指定了电子邮件的表示方式;e、 g.电子邮件标题是什么,它们的含义是什么,以及电子邮件的正文(内容)是如何表示的

问题出在这里。1982年规定了RFC 822。这比Unicode早了很多年。RFC 822已经更新了几次,最新版本是。但是,RFC 5322仍然保留电子邮件标题字段(例如“主题:”字段)必须由ASCII字符组成的约束。(换句话说,在受试者中直接使用UTF-8将违反规范。)

幸运的是,有一个解决办法。该标准提供了一种语法,用于通过ASCII传递以另一种字符编码(如UTF-8)编码的文本。MIME规范已经明确指出 您可以在电子邮件标题中使用RFC1342编码

RFC 1342编码的一般形式为:

    =?charset?encoding?encoded-text?=
其中,
字符集
是标准字符集名称,
编码
Q
B
(带引号的字符串或base64),而
编码文本
是指定字符集中表示的文本,并使用指定编码进行编码。例如:

    =?utf-8?Q?hello?=
请参考RFC了解更多详细信息

请注意,如果使用
javax.mail
API构建电子邮件,设置UTF-8编码电子邮件主题的正确方法如下:

    message.setSubject("We love Java® !!", "UTF-8");
或者使用Java的
\uxxx
Unicode转义

不幸的是,Apache Commons电子邮件API不允许您这样做。但是(如果我正确阅读了代码),它将尝试使用电子邮件的字符集(请参见
setCharset()
)或默认字符集对包含非ASCII字符的标题字段进行编码

因此,如果在使用Apache Commons电子邮件API时未正确传递普通的“
,则解决方案是使用
setCharset(“UTF-8”)
来设置电子邮件的字符集。(事实上,证据表明该角色已经被正确处理,因此这可能是多余的。)


这解决了Unicode字符的问题。您还试图在“主题:”中包含HTML标记。据我所知,任何电子邮件规范都不支持邮件标题中的HTML标记。事实上,如果电子邮件发送者试图在Subject:header中呈现HTML标记,则可能会违反规范


不过,还有另一种选择,因为Unicode允许您修改字符,使其成为下标或上标;有关详细信息,请参阅。如果您尝试这种方法,您将受制于收件人的电子邮件客户端的Unicode呈现。

@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) + "?=");

大多数客户端不支持在主题行中呈现HTML。@Thilo,表示可能或不可能?表示如果您发送这样的电子邮件,几乎每个人都会看到原始HTML标记。