Сгенерированное PHP вложение CSV, похоже, теряет часть первой строки через Outlook, но не через Gmail

У меня есть PHP-скрипт, работающий через cron под FreeBSD 8.0, sendmail, PHP 5.2.11 (cli).

Первая строка 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 новой строки...

У кого-нибудь есть какие-либо советы о том, что происходит?

// По запросу ссылка на электронное письмо с заголовками http://pastebin.com/wuyVf9HP

// РЕДАКТИРОВАТЬ добавление всей почтовой процедуры по запросу 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 <[email protected]>\r\nReply-To: [email protected]\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);

person jerrygarciuh    schedule 18.09.2011    source источник
comment
Очень странно! Я знаю, что Windows требует возврата каретки и перевода строки для конца строки, тогда как Unix просто требует перевода строки - это может иметь какое-то отношение к этому...   -  person Stevo    schedule 19.09.2011
comment
Если вы получаете неожиданные результаты при отправке электронных писем, скорее всего, вы нарушили RFC при создании источника сообщения. Когда электронная почта работает нормально в одном месте и не работает в другом, это не означает, что во втором месте есть какие-то ошибки, скорее всего, это первое место, которое каким-то образом исправило ваш источник электронной почты, чтобы заставить его работать (чего на самом деле не должно происходить) . Нам нужно понять, как вы создаете источник электронной почты, чтобы помочь вам лучше.   -  person XzKto    schedule 19.09.2011
comment
@Steveo - я тоже думал об этом, но мы делали это только с помощью \n в течение многих лет без проблем. Я пытался перейти на \r\n в начале моей отладки, но безрезультатно.   -  person jerrygarciuh    schedule 19.09.2011
comment
@XzKto - это хороший момент. Я добавил весь код почтовой процедуры в качестве редактирования выше.   -  person jerrygarciuh    schedule 19.09.2011
comment
Можно ли открыть полученную почту в Gmail в режиме отображения оригинала и поместить результат куда-нибудь в Интернет (например, в pastebin)?   -  person ott--    schedule 19.09.2011
comment
@ott — вот источник электронной почты с обрезанной серединой вложения: pastebin.com/wuyVf9HP   -  person jerrygarciuh    schedule 19.09.2011
comment
Я заметил тип содержимого Content-Type: application/zip;. Я использую text/csv для аналогичной задачи. Может быть, Outlook пытается что-то распаковать?   -  person ott--    schedule 19.09.2011
comment
Обновил и запустил; заголовки теперь показывают Content-Type: text/csv; name=20110919154215.gtg2011-2.csv для вложения, но Outlook по-прежнему обрезает символы, а Gmail по-прежнему их показывает.   -  person jerrygarciuh    schedule 19.09.2011
comment
Я разместил свой способ: pastebin.com/depDEmKf - одно отличие состоит в том, что я указываю \r\n явно, в то время как ваш содержимое будет содержать только \n. Интересно, имеет ли это значение?   -  person ott--    schedule 20.09.2011
comment
давайте продолжим это обсуждение в чате   -  person ott--    schedule 20.09.2011


Ответы (1)


Не уверен, решит ли это проблему или нет, но я предлагаю попробовать использовать fputcsv вместо создания 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);
}
person mfonda    schedule 18.09.2011