首页 文章

处理电子邮件 Headers 中的空白行

提问于
浏览
4

遇到了一些不符合RFC的邮件

authentication-results: spf=none (sender IP is ) smtp.mailfrom=**@********.**;

Content-Type: multipart/related;
    boundary="_004_2039b206f2a54788ba6a101978bd3f82DBXPR07MB013eurprd07pro_";
    type="multipart/alternative"
MIME-Version: 1.0

例如,上面的邮件在 Headers 中有一个空行(在Content-Type之前) . 严格遵守RFC(例如https://github.com/mikel/mail)的图书馆赢了;它们能够解析它们 . Apple Mail,Thunderbird设法处理这些邮件 .

试图浏览Thunderbird的代码库,不熟悉C,我只是设法找到https://github.com/mozilla/releases-comm-central/blob/1f2a40ec2adb448043de0ae96d93b44a9bfefcd1/mailnews/mime/src/mimemsg.cpp

有人能指出Thunderbird代码库中发生邮件解析的部分,或任何处理此类非投诉邮件的开源库/应用程序 .

EDIT:

空白行的Hexdump . 它包含一个空间 .

00013e0: 2a2a 2a2a 2a2a 2e2a 2a3b 0d0a 200d 0a43  ******.**;.. ..C
00013f0: 6f6e 7465 6e74 2d54 7970 653a 206d 756c  ontent-Type: mul
0001400: 7469 7061 7274 2f72 656c 6174 6564 3b0d  tipart/related;.

1 回答

  • 3

    引用的ruby library中的Ruby代码未向RFC确认,RFC允许将多行折叠成单个 Headers 行 . 规则是延续 Headers 行(折叠 Headers )应该以空格开头 - 具体细节在RFC 5322,部分"Folding White Space and Comments"中 .

    最可能的问题是Ruby代码正在读取每一行并在解析之前修剪空格 - 因此未能检测到额外的行实际上属于前一个 Headers - 但是额外的行不会向 Headers 添加任何内容(因为它只包含一个空格),但它是有效的语法 .

    EDIT:

    在__9000041_中引入了不符合规范的行为 . 引入的副作用之一是将 Headers 和主体分开放在空的折叠 Headers 上

    CRLF = /\r\n/
    white_space = %Q|\x9\x20|
    WSP = /[#{white_space}]/
    
    header_part, body_part = raw_source.split(/#{CRLF}#{WSP}*#{CRLF}(?!#{WSP})/m, 2)
    

    问题在提交a2a45597bce66ebe788cedaaab848a37bd04b25a中提出,但共识是不破坏现有行为 .

相关问题