R_U*_*ser 3 php email character-encoding rfc822 rfc2822
我正在尝试使用PHP发送和阅读电子邮件。到目前为止,我发现我必须使用函数来编码特殊字符mb_encode_mimeheader(),但是不必编码空格。
我还发现,地址栏中的括号不起作用:(http://stackoverflow.com/questions/11989915/is-there-an-error-in-phps-imap-fetch-overview-function-when -reading-headers-w)。例如,PHP无法访问header-section From: Admin [] <user@mail.tld>,但可以读取header-section From: "Admin []" <user@mail.tld>。
因此,显然括号在邮件标题中具有特殊含义(至少对于PHP)。是有什么在Mailheader特殊字符,什么北京时间它们的意义,并在那里做他们需要进行编码/报价?
例如,尽管主题也是标头的一部分,但PHP的主题中的括号没有问题。
看来引号可以帮助我解决该问题(http://tools.ietf.org/html/rfc5322#section-3.2.4-我仍然不是100%确定这是PHP的问题还是不正确的邮件头)。但是如何使用引号,以及引号会转义什么呢?
在http://tools.ietf.org/html/rfc5322#section-3.2.4中说:
包含除原子中允许的字符以外的字符的字符串可以用带引号的字符串格式表示,该字符用引号(DQUOTE,ASCII值34)包围。
因此,我现在应该自己“转义/引用”每个字符
From: Admin "[""]" <user@mail.tld>
Run Code Online (Sandbox Code Playgroud)
还是一起引用所有内容好吗?
From: "Admin []" <user@mail.tld>
Run Code Online (Sandbox Code Playgroud)
但是,如果其他控制序列用引号引起来,会发生什么情况?例如ÄÖÜ,我的String中有特殊字符,这些特殊字符编码为=?UTF-8?B?w4PChMODwpbDg8Kc?=。因此,根据RFC,“带引号和编码的”字符串是否还可以?
From: "Admin [=?UTF-8?B?w4PChMODwpbDg8Kc?=]" <user@mail.tld>
Run Code Online (Sandbox Code Playgroud)
如果您有RFC2047,则最好将整个标头编码为RFC2047,而不必担心引用。
显然您已经找到了RFC5322,这是需要引用什么以及为什么引用的权威来源。基本上,任何不属于电子邮件地址的内容都必须引用为电子邮件地址。传统的报价机制是反斜杠和/或双引号,但是使用MIME,您可以使用可用的MIME编码轻松地对所有内容进行透明编码。
您提供的链接说明,“原子”中不允许使用的字符需要引号。原子中允许使用的字符列表在上一节中。
Run Code Online (Sandbox Code Playgroud)ALPHA / DIGIT / ; Printable US-ASCII "!" / "#" / ; characters not including "$" / "%" / ; specials. Used for atoms. "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
如果您对ASCII表进行交叉检查,则会得到
ALPHA / DIGIT / ; Printable US-ASCII
"!" / "#" / ; characters not including
"$" / "%" / ; specials. Used for atoms.
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
Run Code Online (Sandbox Code Playgroud)
在某些情况下,允许在不加引号的情况下使用上述加点(句号,句点,ASCII 46)作为集合的“点原子”。
有些客户显然在谨慎方面犯了错误(有些客户只是将所有内容都用双引号引起来,好像您的真实姓名并非真正的真实姓名一样。那太糟了)。
我的理解是,在允许一个原子的地方允许使用RFC2047序列,但这意味着它不能与另一个原子相邻。无论如何,我会提出建议,甚至不建议在同一标头中混合使用引号和RFC2047换行,而不是找出它们的交互方式(然后可能发现您的解释不是镇上唯一的游戏,因为其他人找出错误,或因为对该规范有多种有效解释)。