4

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

我还发现,地址归档中的括号不起作用:(在读取带括号的标题时,PHP 的 imap_fetch_overview() 函数是否有错误?)。例如 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>
4

1 回答 1

5

如果您有 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 包装在同一个标​​题中,而不是可能弄清楚它们如何交互(然后可能会发现你的解释不是城里唯一的游戏,或者因为其他人做了弄错了,或者因为对规范有多种有效的解释)。

于 2012-08-20T10:44:47.347 回答