![电子邮件地址的本地部分允许使用两个句点吗?](https://linux22.com/image/586300/%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E5%9C%B0%E5%9D%80%E7%9A%84%E6%9C%AC%E5%9C%B0%E9%83%A8%E5%88%86%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E4%B8%A4%E4%B8%AA%E5%8F%A5%E7%82%B9%E5%90%97%EF%BC%9F.png)
第三方电子邮件网关中继拒绝处理我们发送的电子邮件地址的消息。该地址的格式为[电子邮件保护](请注意两个句点)。RFC 指南允许这样做吗?
RFC 2822第 3.4.1 节似乎对此表示反对:
本地解释的字符串要么是引号字符串,要么是点原子。如果字符串可以表示为点原子(即,它不包含除 atext 字符或 atext 字符包围的“.”以外的任何字符),则应使用点原子形式,不应使用引号字符串形式。不应在 addr-spec 中的“@”周围使用注释和折叠空格。
此外,在同一部分中,它引用了以下内容:
地址规范 = 本地部分“@”域
本地部分 = 点原子 / 引用字符串 / obs 本地部分
我将其解释为 localpart 可以包含由点分隔的内容,但不能有两个连续点,并且不能以点开头或结尾。话虽如此,我不熟悉点原子语法,所以也许我在这里弄错了。
有人可以确认并解释一下吗?
答案1
是的,你说得对。你引用的部分说它必须是带引号的字符串或点原子。因为它显然不是带引号的字符串(没有封闭"
就更清楚了)它必须是一个点原子......
这引出了点原子的定义:
看看这个,除了RFC 5322(3.2.3 - 第 13 页) (RFC 2822 包含类似部分)提示是1*
in dot-atom-text = 1*atext *("." 1*atext)
。这实际上意味着点原子由一个或多个“atext”字符组成的字符串,这些字符串由点分隔。0 个 atext 字符的字符串不计算在内,因此您不能有两个连续的点(以 0 个字符分隔)或前导点或尾随点。
RFC 5322 Internet Message Format October 2008
atext = ALPHA / DIGIT / ; Printable US-ASCII
"!" / "#" / ; characters not including
"$" / "%" / ; specials. Used for atoms.
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
atom = [CFWS] 1*atext [CFWS]
dot-atom-text = 1*atext *("." 1*atext)
dot-atom = [CFWS] dot-atom-text [CFWS]
specials = "(" / ")" / ; Special characters that do
"<" / ">" / ; not appear in atext
"[" / "]" /
":" / ";" /
"@" / "\" /
"," / "." /
DQUOTE
答案2
您的解释是正确的。本地部分可以包含以句点分隔的文本组,但不允许包含多个连续的句点。
按照RFC 5322 第 3.4.1 节您在问题中引用的点原子“不包含除 atext 字符之外的任何字符,或者不包含被 atext 字符包围的“.”“。因此,根据定义,点原子可能不包含两个或多个连续的周期。
作为参考,以下是 atext 定义,取自RFC 5322 第 3.2.3 节:
atext = ALPHA / DIGIT / ; Any character except controls,
"!" / "#" / ; SP, and specials.
"$" / "%" / ; Used for atoms
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
当然,没有两个 MTA 以相同的方式执行 RFC,因此您会发现有些 MTA 会接受双句点,而其他 MTA 则不会。例如,Exchange 将拒绝发送包含双句点的地址,但对我使用的 3 个邮件服务器进行随机快速测试后发现,它们都支持双句点。
因此,严格按照 RFC 5322,托管您遇到问题的中继的组织完全有权拒绝包含双句点的地址。