繁体   English   中英

转义 email 主题行

[英]Escape email subject line

我知道 email 主题不必转义,因为(据我所知)是 HTTP 标题而不是 HTML 文本。

所以写作è 在主题行内将 output è 给用户。

我想发送一些自动电子邮件,并且在某些语言中它们也包含一些非 ascii 字符。

由于我的主机集成编辑器(我有时用于快速编辑)不支持 UTF-8 编码,我更喜欢仅使用 ASCII 并且我总是转义所有内容( à用于 HTML, \\xe0用于 JS 等等......)

那么,有没有办法仅使用 ASCII 来逃避 email 主题,即使接收者确实支持 UTF-8?

&...; 是 HTML/XML 实体,与 email 无关。 您将无法可靠地将这些转换为所需的符号,我会认为任何将它们转换为错误的结果。

此外,没有“ASCII è”之类的东西。 “ASCII”不是真正的编码,“扩展 ASCII”是对 ISO8859 和/或 Microsoft cp12XX 编码的误用。 如果您的客户不能支持除了无重音的英文文本之外的任何内容,那么您只能使用这些。

也就是说,根据规范,虽然所有 email 标头都必须是 7 位安全的“ASCII”文本,但规定对包含其他字符集中文本的 header 进行编码。 UTF、ISO、MS CP 等

function encode_subject($input, $charset, $method='B') {
    switch($method) {
        case 'B':
            $encoded = base64_encode($input);
            break;
        case 'Q':
            $encoded = quoted_printable_encode($input);
            break;
        default:
            throw new Exception('Unknonw encoding method: ' . $method);
    }

    return sprintf('=?%s?%s?%s?=', $charset, $method, $encoded);
}

$input     = 'Welcome to the fancy è club!'; // utf8
$utf8      = $input;
$iso8859_1 = mb_convert_encoding($input, 'iso-8859-1', 'utf-8');
$cp1252    = mb_convert_encoding($input, 'cp1252',     'utf-8');

var_dump(
    $utf8,
    encode_subject($utf8, 'utf-8', 'B'),
    encode_subject($utf8, 'utf-8', 'Q'),
    $iso8859_1,
    encode_subject($iso8859_1, 'iso-8859-1', 'B'),
    encode_subject($iso8859_1, 'iso-8859-1', 'Q'),
    $cp1252,
    encode_subject($cp1252, 'cp1252', 'B'),
    encode_subject($cp1252, 'cp1252', 'Q')
);

Output:

string(29) "Welcome to the fancy è club!"
string(52) "=?utf-8?B?V2VsY29tZSB0byB0aGUgZmFuY3kgw6ggY2x1YiE=?="
string(45) "=?utf-8?Q?Welcome to the fancy =C3=A8 club!?="

string(28) "Welcome to the fancy � club!"
string(57) "=?iso-8859-1?B?V2VsY29tZSB0byB0aGUgZmFuY3kg6CBjbHViIQ==?="
string(47) "=?iso-8859-1?Q?Welcome to the fancy =E8 club!?="

string(28) "Welcome to the fancy � club!"
string(53) "=?cp1252?B?V2VsY29tZSB0byB0aGUgZmFuY3kg6CBjbHViIQ==?="
string(43) "=?cp1252?Q?Welcome to the fancy =E8 club!?="

因此,无论您发送电子邮件的字符集是什么,都可以使用它来编码主题。 如果您的收件人正在使用旧的、被破坏的邮件客户端,这些客户端无法正确解码他们可能说的语言的文本,那么他们有更大的问题与您无关。

热卖

UTF-8 无处不在,适用于一切。 2020 年不支持 UTF8 的任何东西都是有缺陷的,而不是您的问题。 除非您的目标市场是使用 Windows ME 或 2004 年的 Palm Pilot 的人,否则请使用 UTF-8。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM