Проблема форматирования почты PHP - Почему окончания строк заголовка CRLF нарушают работу электронной почты HTML в Outlook? - PullRequest
2 голосов
/ 10 августа 2010

Я использую встроенную в 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, если я не соответствую инструкции?

Информация:

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

Ответы [ 4 ]

4 голосов
/ 08 февраля 2012

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

2 голосов
/ 01 ноября 2011

У вас есть 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

0 голосов
/ 11 августа 2010

Я подозреваю, что это моя версия 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);
0 голосов
/ 10 августа 2010

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

В вашем коде отсутствует объявление border header Объявление:

$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#Multipart_messages

...