1

在周末,我们的 MTA (POSTFIX) 突然开始在我们的消息边界前添加换行符。我们有几个 PHP 模板,它们定义了多部分/替代消息并定义了标题。这是 PHP 邮件格式,它在星期五工作,然后在星期一突然停止。

$headers = "From: name <our@example.com>\r\n" .
   "Reply-To: name <our@example.com>\r\n" .
   "MIME-Version: 1.0\r\n" .
   "Content-Type: multipart/alternative; boundary=\"09127kjhd821\"";

$txt = "\r\n\r\n--09127kjhd821\r\n" .
   "Content-Type: text/plain; charset=UTF-8\r\n" .
   "Content-Transfer-Encoding: quoted-printable\r\n\r\n" .
   "Text Message";

$html = "\r\n\r\n--09127kjhd821\r\n".
   "Content-Type: text/html; charset=UTF-8\r\n" .
   "Content-Transfer-Encoding: base64\r\n\r\n" .
   chunk_split( base64_encode( "HTML Message") );

$body = $txt . $html . "\r\n\r\n--09127kjhd821--";

mail(
   "someone@example.com",
   "=?UTF-8?B?" . base64_encode( "Subject" ) . "?=",
   $body,
   $headers
);

将原始邮件与损坏的邮件进行比较,我看到以下损坏:

Date: Fri,  3 Aug 2012 16:52:39 -0400 (EDT)





--09127kjhd821

Content-Type: text/plain; charset=UTF-8

Content-Transfer-Encoding: quoted-printable

原始(工作)

Date: Tue, 31 Jul 2012 12:36:45 -0400 (EDT)



--09127kjhd821
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

正如您所看到的,每个 \r 和 \n 的换行符几乎翻了一番,据我所知,没有任何改变会导致这种情况。

非常感谢任何建议或帮助。

4

1 回答 1

2

我唯一能想到的是将 LF 转换为 CRLF 的 POSTFIX 和 PHP 问题,因此当在消息正文中为边界和标头定义 CRLF 时,它将被转换为 CRCRLF。但是,保存消息源仅在十六进制编辑器中显示为 CRLF,这可能是我使用的编辑器或电子邮件客户端下载过程中的转换。

我仍然不明白为什么它突然改变了,因为它以前工作正常。我能想到的唯一区别可能是由于脚本行尾可能已从 CRLF 更改为 LF 导致发生转换,从而破坏了正文中包含 CRLF 的电子邮件。

我最终通过将 php.ini 中的 sendmail_path 更改为

sendmail_path="/usr/bin/dos2unix|/usr/sbin/sendmail -t -i"
于 2012-08-14T17:18:55.490 回答