如何根据RFC 5322折叠具有长电子邮件地址的电子邮件标头?

时间:2016-03-24 05:44:05

标签: email header rfc5322

假设电子邮件包含以下标题字段:

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

有没有办法折叠标题

  1. 完全符合RFC 5322
  2. 使得电子邮件仍然被常用的MTA接受,并且
  3. 没有行超过78个字符的长度?
  4. 我知道线路长度的硬限制是998个字符,但我想知道是否有可能满足所有SHOULD要求。如果我理解增强的Backus-Naur表格

    domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
    
    dtext           =   %d33-90 /          ; Printable US-ASCII
                        %d94-126 /         ;  characters not including
                        obs-dtext          ;  "[", "]", or "\"
    
    正确地在section 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的解释是错误的。

    附录,以防有人遇到类似问题:

    在发布问题之前,我实际上尝试折叠@.,如符合RFC的example by jstedfast所示,但得到了相同的错误消息。事实证明,这不是MTA的错,而是我使用的SMTP客户端库,它从标头中提取收件人地址,以便为SMTP生成RCPT TO:命令,并且无法过滤掉换行符。< / p>

1 个答案:

答案 0 :(得分: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的地址解析器会处理此问题; - )

相关问题