Проблема форматирования почты 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 <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"; заголовок письма.
  2. Убедитесь, что я заканчиваю свои заголовки только " \n " вместо " \r\n ".

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

Информация:

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

4 ответа

Решение

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

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

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

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

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

ВАЖНО: Некоторые веб-хостеры могут использовать только стабильные пакеты, что означает, что вы можете иметь... Постфикс старше 2.9!!! Пример: http://packages.debian.org/search?keywords=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);

Электронная почта интерпретируется как текстовая / обычная, а не как 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 Messages: http://en.wikipedia.org/wiki/MIME

Другие вопросы по тегам