PHP生成的CSV附件似乎通过Outlook丢失了第一行的一部分,但Gmail没有

PHP生成的CSV附件似乎通过Outlook丢失了第一行的一部分,但Gmail没有,php,csv,freebsd,outlook-2010,Php,Csv,Freebsd,Outlook 2010,我在FreeBSD8.0、sendmail、PHP5.2.11(cli)下通过cron运行了一个PHP脚本 CSV的第一行由以下行定义: $content .= "\n" . 'first_name,last_name,address1,address2,city,state_province,postal_code,country' . "\n"; 在移动到当前服务器之前,此脚本工作正常,但现在有一个小故障: 如果通过Outlook接收电子邮件,则Excel中的第一行如下所示: ate_p

我在FreeBSD8.0、sendmail、PHP5.2.11(cli)下通过cron运行了一个PHP脚本

CSV的第一行由以下行定义:

$content .= "\n" .  'first_name,last_name,address1,address2,city,state_province,postal_code,country' . "\n";
在移动到当前服务器之前,此脚本工作正常,但现在有一个小故障:

如果通过Outlook接收电子邮件,则Excel中的第一行如下所示:

ate_province    postal_code country
在文本编辑器中:

ate_province,postal_code,country
我在开头添加了一个额外的“\n”,并看到它在删节字符串中添加了一个字符,所以我尝试添加31,并且确信Outlook、我的文本编辑器和Excel可以看到一个完美的文件

然后我登录到Gmail,下载了应该是完全相同的文件,因为它是完全相同的电子邮件。我在Excel和我的文本编辑器中打开它,除了31个换行符,我应该找到什么呢

有人对正在发生的事情有什么建议吗

//按请求链接到带有标题的电子邮件

//根据XzKto的请求编辑添加整个邮件例程

if (fwrite($handle, $content) === FALSE) {
  die("Cannot write to file ($filename)");
}
$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: xxxx <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);
if(fwrite($handle,$content)==FALSE){
die(“无法写入文件($filename)”);
}
$message=“这是\n的地址文件(逗号分隔值);
$message.=$pm\u行['title']。“请求($now\u YmdHMS)。\n\n”;
$data_email=$pm_行['fulfillment_data_email'];
$data\U email\U cc=“$pm\U行[履行\U data\U email\U cc],$developer\U email”;
$subject=$pm_行['title']。“请求($now_YmdHMS)”;
$random_hash=md5(日期('r',时间());
$headers=“From:xxxx\r\n提交至:tourism@xxx.org\r\nCc:$data\u email\u cc”;
$headers.=“\n内容类型:多部分/混合;边界=\”PHP混合-“$random\u散列。“\”;
$attachment=chunk\u split(base64\u编码(文件获取内容($filename));
$output=”
--PHP混合-$random_散列;
内容类型:multipart/alternative;boundary='PHP-alt-$random\u hash'
--PHP alt-$random_散列
内容类型:文本/普通;字符集='iso-8859-1'
内容传输编码:7bit
$message
--PHP alt-$random_散列
内容类型:text/html;charset='iso-8859-1'
内容传输编码:7bit
$message
--PHP alt-$random_散列--
--PHP混合-$random_散列
内容类型:application/zip;name=$now\u YmdHMS.$pm\u row[handle].csv
内容传输编码:base64
内容配置:附件
$attachment
--PHP混合-$random_hash--“;
邮件($data\u email,$subject,$output,$headers);

不确定这是否能解决问题,但我的建议是尝试使用,而不是手动构建CSV文件

用法如下所示:

$fp = fopen('output.csv', 'w');
$fields = array('first_name', 'last_name', 'address1', .....);
$rows = func_that_returns_data();

fputcsv($fp, $fields);
foreach ($rows as $row) {
    fputcsv($fp, $row);
}

很奇怪!我知道windows需要回车符和换行符作为换行符,而unix只需要换行符-这可能与此有关…如果您在发送电子邮件时收到一些意外结果,则很可能在生成消息源时破坏了RFC。当电子邮件在一个地方正常工作,而在另一个地方坏了,这并不意味着第二个地方有一些bug,很可能是第一个地方以某种方式修复了你的电子邮件源,使其正常工作(这真的不应该发生)。我们需要了解您如何生成电子邮件源以更好地帮助您。@Steveo-我也考虑过这一点,但我们已经用\n多年没有问题地完成了这些工作。我在调试的早期尝试更改为\r\n,但没有效果。@XzKto-这是一个很好的观点。我在上面添加了整个邮件例程的代码作为编辑。是否可以在gmail中的“show original”中打开收到的邮件,并将结果放在web上的某个地方(例如pastebin)?