电子邮件标头中有哪些特殊字符以及何时使用引号



我正在尝试使用PHP发送和阅读电子邮件。到目前为止,我发现我必须使用函数 mb_encode_mimeheader() 对特殊字符进行编码,但我不必对空格进行编码。

我还发现地址字段中的括号不起作用:(读取带括号的标题时,PHP 的 imap_fetch_overview()-函数是否有错误?例如PHP无法读取标头部分From: Admin [] <user@mail.tld>,但可以读取标头部分From: "Admin []" <user@mail.tld>

所以,很明显,括号在邮件头中具有特殊的含义(至少对于PHP)。邮件头中的特殊字符有什么,它们的含义是什么,它们需要在哪里编码/引用?

例如,PHP 在主题中的括号没有问题,尽管主题也是标头的一部分。

引号似乎可以帮助我解决问题(https://www.rfc-editor.org/rfc/rfc5322#section-3.2.4 - 我仍然不能 100% 确定这是 PHP 的问题还是不正确的邮件头)。但是如何使用引号,引号转义了什么?

在 https://www.rfc-editor.org/rfc/rfc5322#section-3.2.4 中,它说:

包含字符以外的字符的字符串原子中允许的可以用带引号的字符串格式表示,其中字符用引号括起来(DQUOTE,ASCII 值 34)字符。

那么,我现在是否应该自己"转义/引用"每个角色

From: Admin "[""]" <user@mail.tld>

还是将所有内容一起引用可以?

From: "Admin []" <user@mail.tld>

但是,如果引号中包含其他控制序列,会发生什么情况?例如,我的字符串中ÄÖÜ了特殊字符,这些字符被编码为 =?UTF-8?B?w4PChMODwpbDg8Kc?= .那么,根据 RFC,"带引号和编码"的字符串还能吗?

From: "Admin [=?UTF-8?B?w4PChMODwpbDg8Kc?=]" <user@mail.tld>

如果你有RFC2047,你不妨将整个标头编码为RFC2047,而忘记引用。

显然,您已经找到了RFC5322,这是需要引用的内容和原因的权威来源。 基本上,任何具有电子邮件地址含义的东西都需要引用,如果它不是电子邮件地址的一部分。 传统的引用机制是反斜杠和/或双引号,但使用 MIME,您可以使用可用的 MIME 编码轻松地透明地编码所有内容。

您提供的链接解释了"原子"中不允许的字符需要引用。 原子中允许的字符列表在上一节中。

ALPHA / DIGIT /    ; Printable US-ASCII
                   "!" / "#" /        ;  characters not including
                   "$" / "%" /        ;  specials.  Used for atoms.
                   "&" / "'" /
                   "*" / "+" /
                   "-" / "/" /
                   "=" / "?" /
                   "^" / "_" /
                   "`" / "{" /
                   "|" / "}" /
                   "~"

如果对照 ASCII 表进行交叉检查,则得到

32   (space)                    not OK
33 !                            OK
34 "                            not OK
35 # through $%& 38             OK
39 ' through () 41              not OK
42 * through + 43               OK
44 ,                            not OK
45 -                            OK
46 .                            not OK
47 / through 0123456789 57      OK
58 : through ;< 60              not OK
61 =                            OK
62 >                            not OK
63 ?                            OK
64 @                            not OK
65 A through BCD...XYZ 90       OK
91 [ through ] 93              not OK
94 ^ through _ 95               OK
96 `                            not OK
97 a through bcd...xyz{|}~ 126  OK
127 DEL                         not OK

在某些情况下,允许使用上述集合"点原子"加上点(句号,句点,ASCII 46)而不引用。

有些

客户显然会谨慎行事(有些客户会简单地将所有内容放在双引号中,就好像您的真实姓名并不是您的真实姓名一样。 这很糟糕)。

我的理解是,在允许一个原子的地方,RFC2047序列是允许的,但这意味着它不能与另一个原子相邻。 无论如何,我会应付并建议不要尝试在同一个标题中混合引用和RFC2047包装,而不是弄清楚它们是如何交互的(也许然后发现你的解释不是城里唯一的游戏,要么是因为其他人在弄清楚时犯了错误,要么是因为规范有多种有效的解释)。

相关内容

  • 没有找到相关文章

最新更新