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

Я использую функцию PHP native 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 <info@example.com>\r\n"; $headers .= "Reply-To: donotreply@example.com\r\n"; mail('me@example.com', 'test', $message, $headers); 

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

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

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

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

Информация:

  • Я использую постфиксную версию 2.3.3 для RHEL 5.5.
  • PHP версия 5.3.2

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

  1. Обновите Postfix до +2.9, который имеет «sendmail_fix_line_endings» (наконец !!!) См. Документацию Postfix
  2. Установите Sendmail (работайте отлично!)

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

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

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

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

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

Я подозреваю, что моя версия 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 <info@example.com>".$eol; $headers .= "Reply-To: donotreply@example.com".$eol; mail('me@example.com', 'test', $message, $headers); 

Электронная почта была интерпретирована как 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 <info@example.com>\r\n"; $headers .= "Reply-To: donotreply@example.com\r\n"; mail('me@example.com', 'test', $message, $headers); 

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