1

假设一封电子邮件具有以下标头字段:

To: =?utf-8?q?Foo_Bar?= <1234567890123456789012345678901234567890123456789012345678901234@abcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghi.com>

有没有办法折叠标题

  1. 完全符合RFC 5322
  2. 这样电子邮件仍然被常用的 MTA 接受,并且
  3. 没有行超过 78 个字符?

我知道行长的硬性限制是 998 个字符,但我想知道是否也可以满足所有应该的要求。如果我理解增强巴库斯-瑙尔形式

domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]

dtext           =   %d33-90 /          ; Printable US-ASCII
                    %d94-126 /         ;  characters not including
                    obs-dtext          ;  "[", "]", or "\"

第 3.4.1 节中,可以正确地将折叠空格插入域文字中,并且以下内容应该是有效的:

To: =?utf-8?q?Foo_Bar?=
 <1234567890123456789012345678901234567890123456789012345678901234@abcdefgh
 iabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghi.com>

但是,最近版本的 postfix 和 exim 拒绝了这一点:

501:  <1234567890123456789012345678901234567890123456789012345678901234@abcdefgh: '>' missing at end of address

要么两个 MTA 都被破坏(这似乎不太可能),要么我对 RFC 的解释是错误的。

万一有人遇到类似问题的附录:

在发布问题之前,我实际上尝试折叠,@jstedfast.的 RFC-conformant示例所示,但得到了相同的错误消息。事实证明,这不是 MTA 的错,而是我使用的 SMTP 客户端库的错,它从标头中提取了收件人地址以生成SMTP 的命令,但未能过滤掉换行符。RCPT TO:

4

1 回答 1

1

不允许您在域中间(这是您所做的)跨越线边界打破域,仅在域之前/之后。

RFC5322 说你不应该打破@,但这并不意味着可能不。

angle-addr      =   [CFWS] "<" addr-spec ">" [CFWS] /
                    obs-angle-addr

addr-spec       =   local-part "@" domain

local-part      =   dot-atom / quoted-string / obs-local-part

domain          =   dot-atom / domain-literal / obs-domain

domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]

dtext           =   %d33-90 /          ; Printable US-ASCII
                    %d94-126 /         ;  characters not including
                    obs-dtext          ;  "[", "]", or "\"

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

因此,如果我们扩展定义并将其应用于您的示例,我们得到的是(每个标记在自己的行上,以避免需要水平滚动):

[CFWS]
"<"
[CFWS] 
"1234567890123456789012345678901234567890123456789012345678901234"
[CFWS]
"@"
[CFWS] 
"abcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghi"
"."
"com"
[CFWS]
">"

无论您在哪里看到[CFWS]规范技术上允许您插入换行符的地方。

To因此,打破标题的示例方法是:

To: =?utf-8?q?Foo_Bar?=
 <
 1234567890123456789012345678901234567890123456789012345678901234
 @
 abcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghi.com
 >

任何符合 RFC 的地址解析器都需要处理它。

(这里是自我推销,但MimeKit的地址解析器会处理这个 ;-)

于 2016-03-24T17:07:02.550 回答