Проблема с форматированием почты PHP. Почему окончания строки заголовка CRLF нарушают электронную почту HTML в Outlook?

Я использую встроенную в PHP функцию mail() для отправки электронных писем в формате HTML, и у меня возникла проблема с форматированием в наиболее распространенном среди пользователей почтовом клиенте — Outlook 2007 (в дополнение к некоторым другим почтовым клиентам ) - все теги html открыты, поэтому для не-веб-разработчика это выглядит тарабарщиной.

Я отправляю электронную почту в формате HTML так же, как это показано в руководстве по PHP. Пример:

$message  = get_HTML_email_with_valid_formatting();
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: example.com <[email protected]>\r\n";
$headers .= "Reply-To: [email protected]\r\n";
mail('[email protected]', 'test', $message, $headers);

Поскольку тестировать различные почтовые клиенты сложно, я зарегистрировался на http://litmusapp.com/, чтобы видеть скриншот писем в 47 разных почтовых клиентах. Большинство из них в порядке (например, Gmail, Thunderbird, Lotus Notes), но все разные версии Outlook не в порядке.

Чтобы решить проблему с форматированием, я сделал следующее:

  1. Удалите заголовок почты $headers = "MIME-Version: 1.0\r\n";.
  2. Убедитесь, что я заканчиваю свои заголовки только «\n» вместо «\r\n».

Кто-нибудь знает, почему я получаю лучшие результаты с электронными письмами в формате HTML, когда я не соответствую руководству?

Информация:

  • Я использую postfix версии 2.3.3 на RHEL 5.5.
  • PHP версии 5.3.2

person Tom    schedule 10.08.2010    source источник
comment
Я использую нативную функцию PHP mail() для отправки электронных писем в формате HTML - ну, вот ваша проблема * ;-) Рассматривали ли вы возможность использования чего-то вроде, например. swiftmailer.org ? | * возможно не сама функция mail(), а комбинация mail(), некоторая конкатенация строк и попытка решить проблему протокола и уровня приложения одновременно.   -  person VolkerK    schedule 10.08.2010


Ответы (4)


У вас есть 2 решения:

  1. Обновите Postfix до версии +2.9, в которой есть "sendmail_fix_line_endings" (наконец-то!!!) См.: документацию Postfix
  2. Установите Sendmail (работает нормально!)

У меня есть образ VMware со стеком LAMP. Чтобы отправить электронное письмо, я, наконец, решил:

  • установить Sendmail
  • используйте smtp моего интернет-провайдера (поскольку это только ящик разработчика).

Для части sendmail вы можете следовать этому: http://www.geoffke.be/nieuws/13/

ВАЖНО: некоторые веб-хостеры могут использовать только стабильные пакеты, что означает, что у вас может быть... Postfix старше 2.9!!! Пример: http://packages.debian.org/search?keywords=postfix

person Toto    schedule 31.10.2011

Если вы используете postfix‹2.9, вы можете просто поместить sendmail_path = "tr -d '\r'|sendmail -t -i" в php.ini.

person Anton    schedule 08.02.2012

Я подозреваю, что это моя версия Postfix - версии 2.3.3 5 лет и, возможно, она конвертирует LF в CRLF, но, поскольку у меня уже был CRLF, я думаю, что отправлял CRCRLF почтовым клиентам. .

К сожалению, я не в состоянии обновить Postfix. Итак, на данный момент я преобразовал код, чтобы использовать настраиваемую переменную для концов строк, чтобы ее было легко изменить в будущем:

$eol = "\n";
$message  = get_HTML_email_with_valid_formatting();
$headers  = "MIME-Version: 1.0".$eol;
$headers .= "Content-Type: text/html; charset=UTF-8".$eol;
$headers .= "From: example.com <[email protected]>".$eol;
$headers .= "Reply-To: [email protected]".$eol;
mail('[email protected]', 'test', $message, $headers);
person Tom    schedule 11.08.2010

Электронная почта была интерпретирована как text/plain вместо предполагаемого html. Причина этого в том, что text/html является составным подтипом, поэтому требуется объявление границ.

В вашем коде отсутствует объявление границы заголовка:

$message  = get_HTML_email_with_valid_formatting();
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "--$boundary\r\n"."Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= "From: example.com <[email protected]>\r\n";
$headers .= "Reply-To: [email protected]\r\n";
mail('[email protected]', 'test', $message, $headers);

Проверьте эту вики о MIME и составных сообщениях: http://en.wikipedia.org/wiki/MIME#Multipart_messages

person Codex73    schedule 10.08.2010
comment
...чтобы результат, по крайней мере, соответствовал тому, что все почтовые клиенты будут отображать мусор? - person VolkerK; 10.08.2010
comment
Спасибо за ваш комментарий. У меня сложилось впечатление, что электронные письма в формате HTML не обязательно должны быть составными. т. е. наличие текстовой версии является хорошей практикой, но не обязательно. - person Tom; 11.08.2010