假设电子邮件包含以下标题字段:
To: =?utf-8?q?Foo_Bar?= <1234567890123456789012345678901234567890123456789012345678901234@abcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghi.com>
有没有办法折叠标题
我知道线路长度的硬限制是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>
答案 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的地址解析器会处理此问题; - )