电子邮件标题中的特殊字符是什么以及何时使用引号?

时间:2012-08-17 15:30:04

标签: php email character-encoding rfc822 rfc2822

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

我也发现,地址栏中的括号不起作用:(http://stackoverflow.com/questions/11989915/is-there-an-error-in-phps-imap-fetch-overview-功能时,读取头-W)。例如,PHP无法使用标题部分From: Admin [] <user@mail.tld>,但可以读取标题部分From: "Admin []" <user@mail.tld>

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

例如,虽然主题也是标题的一部分,但主题中的括号没有问题。

似乎引号可以帮助我解决这个问题(http://tools.ietf.org/html/rfc5322#section-3.2.4 - 我仍然不能100%确定这是PHP的问题还是一个不正确的mailheader)。 但是如何使用引号,以及引号转义的内容?

http://tools.ietf.org/html/rfc5322#section-3.2.4中说:

  

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

所以,我现在应该自己“逃避/引用”他自己的每个角色

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

或者把所有东西都引用在一起好吗?

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

但是,如果其他控制序列附有引号,会发生什么?例如,我的String中有特殊字符ÄÖÜ,它们被编码为=?UTF-8?B?w4PChMODwpbDg8Kc?=那么,根据RFC,“引用AND编码”的字符串是否还可以?

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

1 个答案:

答案 0 :(得分:4)

如果您有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

在某些情况下,允许使用设置为“dot-atom”的上述加点(句号,句点,ASCII 46)而不引用。

有些客户显然在谨慎方面犯了错误(有些客户会把所有内容都放在双引号中,好像你的真名不是真正的名字。那很糟糕。)

我的理解是允许原子被允许使用RFC2047序列,但这意味着它不能与另一个原子相邻。无论如何,我会反对并建议不要尝试在同一标题中混合引用和RFC2047包装,而不是可能弄清楚它们如何相互作用(也许然后发现你的解释不是镇上唯一的游戏,要么是因为其他人做的在搞清楚时,或者因为对规范有多种有效的解释,这是一个错误。