我尝试使用PHP发送和阅读电子邮件,到目前为止,我发现必须使用函数mb_encode_mimeheader()
对特殊字符进行编码,但不必对空格进行编码。
我还发现地址字段中的括号不起作用:(Is there an error in PHP's imap_fetch_overview()-function when reading headers with brackets?)。例如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的问题还是邮件头不正确)。但是如何使用引号,以及什么是用引号转义的?
在www.example.com网站上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,'quoted AND encoded'字符串仍然有效吗?
From: "Admin [=?UTF-8?B?w4PChMODwpbDg8Kc?=]" <user@mail.tld>
1条答案
按热度按时间pftdvrlh1#
如果您有RFC 2047,那么您也可以将整个头编码为RFC 2047,而不必考虑引用。
显然你已经找到了RFC 5322,它是关于什么需要引用以及为什么要引用的权威来源。基本上,任何具有电子邮件地址意义的东西,如果它不是电子邮件地址的一部分,就需要引用。传统的引用机制是反斜杠和/或双引号,但是有了MIME,你可以很容易地用可用的MIME编码透明地编码所有东西。
你给出的链接解释了“atoms”中不允许的字符需要用引号括起来。atoms中允许的字符列表在上一节中。
如果您对ASCII表进行交叉检查,则会得到
在某些情况下,集合“dot-atom”是上面的加号(句号、句点、ASCII 46),允许不加引号。
有些客户显然犯了谨慎的错误(有些人会简单地把所有的东西都放在双引号里,就好像你真实的不是你的真名一样。这真糟糕)。
我的理解是RFC 2047序列在允许原子的地方是允许的,但这意味着它不能与另一个原子相邻。无论如何,我会回避并建议不要尝试在同一个头中混合引用和RFC 2047 Package ,而不是可能弄清楚它们是如何交互的(然后可能会发现您的解释并不是唯一的游戏,要么是因为其他人在弄清楚它时犯了错误,要么是因为规范有多个有效的解释)。