Проблема форматирования почты 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 не в порядке.
Чтобы решить проблему с форматированием, я должен был сделать следующее:
- Удалить
$headers = "MIME-Version: 1.0\r\n";
заголовок письма. - Убедитесь, что я заканчиваю свои заголовки только "
\n
" вместо "\r\n
".
Кто-нибудь знает, почему я получаю лучшие результаты с электронными письмами HTML, когда я не подчиняюсь руководству?
Информация:
- Я использую постфикс версии 2.3.3 на RHEL 5.5.
- Версия PHP 5.3.2
4 ответа
У вас есть 2 решения:
- Обновите Postfix до +2.9, который имеет "sendmail_fix_line_endings" (наконец-то!!!) См. Документация Postfix
- Установите 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