电子邮件标题中的特殊字符是啥以及何时使用引号?
Posted
技术标签:
【中文标题】电子邮件标题中的特殊字符是啥以及何时使用引号?【英文标题】:What are special characters in E-Mail-Headers and when to use quotes?电子邮件标题中的特殊字符是什么以及何时使用引号? 【发布时间】:2012-08-14 01:48:00 【问题描述】:我正在尝试使用 php 发送和阅读电子邮件。到目前为止我发现,我必须使用函数mb_encode_mimeheader()
对特殊字符进行编码,但我不必对空格进行编码。
我还发现,地址归档中的括号不起作用:(Is there an error in PHP's imap_fetch_overview()-function when reading headers with brackets?)。例如 PHP 无法读取 header-section From: Admin [] <user@mail.tld>
,但可以读取 header-section From: "Admin []" <user@mail.tld>
。
因此,显然括号在邮件标头中具有特殊含义(至少对于 PHP)。 Mailheader 中有哪些特殊字符,它们的含义是什么,以及它们需要在哪里编码/引用?
例如,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>
【问题讨论】:
【参考方案1】:如果您有 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 包装在同一个标题中,而不是可能弄清楚它们如何交互(然后可能会发现你的解释不是城里唯一的游戏,或者因为其他人做了弄错了,或者因为对规范有多种有效的解释)。
【讨论】:
以上是关于电子邮件标题中的特殊字符是啥以及何时使用引号?的主要内容,如果未能解决你的问题,请参考以下文章