【问题标题】:Escape email subject line转义电子邮件主题行
【发布时间】:2020-06-08 22:52:40
【问题描述】:

我知道电子邮件主题不必转义,因为(据我所知)它们是 HTTP 标头而不是 HTML 文本。

因此在主题行中写入è 会向用户输出è

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

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

那么,有没有办法只使用 ASCII 来转义电子邮件主题,即使收件人确实支持 UTF-8?

【问题讨论】:

    标签: php email utf-8 http-headers escaping


    【解决方案1】:

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

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

    也就是说,虽然所有电子邮件标头必须根据规范是 7 位安全的“ASCII”文本,但 提供了对包含文本的标头进行编码的规定其他字符集。 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')
    );
    

    输出:

    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 的任何东西都是有缺陷的,而不是您的问题。除非您的目标市场是从 2004 年开始使用 Windows ME 或 Palm Pilot 的用户,否则请使用 UTF-8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多