上周末,我们的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的换行几乎翻了一番,没有任何改变我认识会造成这种情况。
非常感谢任何建议或帮助。
答案 0 :(得分:2)
我唯一能想到的是POSTFIX和PHP将LF转换为CRLF的问题,所以当在消息体中为边界和标题定义CRLF时,它将被转换为CRCRLF。 但是保存消息源只会在十六进制编辑器中显示为CRLF,这可能是我使用的编辑器中的转换或电子邮件客户端下载过程。
我仍然不明白为什么它突然改变,因为之前工作正常。 我能想到的唯一区别可能是由于脚本行结尾可能已从CRLF更改为LF导致转换发生,从而破坏了正文中包含CRLF的电子邮件。
我最终通过将php.ini中的sendmail_path更改为
来解决了这个问题sendmail_path="/usr/bin/dos2unix|/usr/sbin/sendmail -t -i"