从sendmail切换到qmail后,某些邮件客户端会看到来自PHP mail()的空CSV附件

时间:2010-04-15 16:37:07

标签: php sendmail qmail

以下代码多年来一直向我们的印刷履行人员发送CSV。由于与我们想要运行的procmail配方有关的原因,sysadmin从sendmail切换到qmail的一周开始。

可能并非巧合的是,我们开始听到即使其他人在邮件上看到记录,实现人员也会看到空的CSV。有问题的人看到附件并可以打开它,但他们的MUI将其列为131字节或零字节。

我们开始向雅虎地址发送相同的结果。但是Gmail会在附件中显示正确的行。请注意,这是一封具有不同结果的CCed电子邮件,具体取决于邮件客户端。

我已经查看了vi中的代码并确保没有^ M字符或其他控制字符垃圾。

之前有人见过吗?欢迎任何建议!

谢谢!

$message = "Here is the file (comma-separated values) of addresses for\n";
$message .= $pm_row['title'] . " Requests ($now_YmdHMS).\n\n";
$data_email = $pm_row['fulfillment_data_email'];
$data_email_cc = "$pm_row[fulfillment_data_email_cc],$developer_email";
$subject = $pm_row['title'] . " Requests ($now_YmdHMS)";
$random_hash = md5(date('r', time()));
$headers = "From: XXX <tourism@xxx.org>\r\nReply-To: tourism@xxx.org\r\nCc:$data_email_cc"; 
$headers .= "\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";
$attachment = chunk_split(base64_encode(file_get_contents($filename)));
$output = "
--PHP-mixed-$random_hash; 
Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
--PHP-alt-$random_hash
Content-Type: text/plain; charset='iso-8859-1'
Content-Transfer-Encoding: 7bit

$message

--PHP-alt-$random_hash 
Content-Type: text/html; charset='iso-8859-1'
Content-Transfer-Encoding: 7bit

$message

--PHP-alt-$random_hash--

--PHP-mixed-$random_hash
Content-Type: application/zip; name=$now_YmdHMS.$pm_row[handle].csv
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment
--PHP-mixed-$random_hash--";

mail($data_email, $subject, $output, $headers);

1 个答案:

答案 0 :(得分:1)

我认为这是一个CR / LF问题,这是PHP中已知的Bug大约三年了 - 据我所知 - 到目前为止还没有修复:

http://bugs.php.net/bug.php?id=15841

由于使用了不符合RFC的换行符格式,生成的电子邮件无效(可在此处找到解释:http://cr.yp.to/docs/smtplf.html)。其他MTA如sendmail和postfix会自动纠正此问题; qmail没有。

您可以:使用php( lol )编写正确的邮件,或者让qmail管理员使用QmailScanner(http://qmail-scanner.sourceforge.net/),这也是这项工作。

最好的解决方案是卸载php并在将来使用perl duck ;)