我已经在CentOS 5服务器上运行了SendMail 8.14.4。
日本的一个用户正在发送一个消息,当它被服务器处理时,SendMail会因为某种原因增加额外的回车。
该电子邮件包含一个X头(可能包含国际字符)。 我说“大概”,因为当我用记事本++检查MIME源时,我看到了像STX和CAN怪异。
我已经能够缩小testing范围:

如果我通过Sendmail发送,它最终会离开SendMail,如下所示:
(ips,Q-ID和主机名改为保护无辜者)
现在显然是一个潜在的红色标志:标题值以一个引号开始,但没有结束标志。 这是RFC标准所要求的吗? 或者那部分是红鲱鱼?
最终的结果是头值泄漏到消息体中:

有关为什么sendmail的任何想法是添加额外的回车?
实际上这非常简单: RFC 2822第2.2.3节允许使用长标题,其中标题是一个字段名,后跟一个:折叠并在下一行继续,只要(简化)下一行以空格开始 。
一般规则是,只要本标准允许折叠空白(不是简单的WSP字符),就可以在任何WSP之前插入CRLF。 例如,标题字段:
Subject: This is a test
可以表示为:
Subject: This is a test
原始input的第3行不是以空格开始,而是以字符c开头,并且不包含冒号:这使得它既不是前一个报头的延续,也不是下一个报头字段(第2.2节)。
这标记为标题的结尾…
而身体的开始。
Sendmail“纠正”这个格式不正确的消息,并在它认为是标题结尾和正文开始之间添加了所需的空白行。
一个简单的telnet邮件会话可以重现该行为:
[user@example ~]$ telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. <<< 220 example.com ESMTP Sendmail 8.14.4/8.14.4; Fri, 17 Jul 2015 20:29:26 +0200 helo localhost <<< 250 example.com Hello localhost [127.0.0.1], pleased to meet you mail from:me@localhost <<< 250 2.1.0 me@localhost... Sender ok RCPT TO:[email protected] <<< 250 2.1.5 [email protected]... Recipient ok data <<< 354 Enter mail, end with "." on a line by itself Subject: test X-header: do not try this at home start the body . <<< 250 2.0.0 t6HITQXA020072 Message accepted for delivery quit
这导致与您的示例类似的消息:
[user@example ~/Maildir/new]$ cat 1437157845.20091_2.example.com Return-Path: <[email protected]> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on example.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, MISSING_HEADERS autolearn=no version=3.3.1 Received: from localhost (localhost [127.0.0.1]) by example.com (8.14.4/8.14.4) with SMTP id t6HITQXA020072 for [email protected]; Fri, 17 Jul 2015 20:30:06 +0200 Date: Fri, 17 Jul 2015 20:29:26 +0200 From: [email protected] Message-Id: <[email protected]> Subject: test X-header: do not try this at home start the body
在原始头部延续和身体的“新”开始之间增加一条新线。