Postfix испортил заголовки писем! - PullRequest
1 голос
/ 10 февраля 2010

Я настроил локальную среду разработки на Snow Leopard и настроил postfix для отправки электронной почты через мой почтовый сервер isp.

Я со временем заставил работать постфикс после большого разочарования, но теперь, когда мои электронные письма отправляют, информация заголовка сбивается с толку!

Я использую следующий код php:

$email = "me@mydomain";
$subject = "Email tester";
$body = "Simple test";
$header = "From: me@mydomain \r\n";
$header .= "MIME-VERSION: 1.0\r\n";
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$phpversion = phpversion();
$header .= "X-Mailer: PHP v$phpversion\r\n";
mail($email,$subject,$body,$header);

echo "message sent!";

Заголовки To: и Subject: отображаются так, как должны, в заголовке !, а остальные отображаются в теле письма. Это делает электронную почту похожей на поле from в почтовом клиенте пустым.

Я пробовал различные php-скрипты, некоторые очень простые, но это одно и то же, заголовки всегда отображаются в теле письма.

Я думаю, что это может быть проблема с постфиксом, но не уверен, кто-нибудь сталкивался с такой проблемой раньше?

Ответы [ 3 ]

3 голосов
/ 17 мая 2011

Используйте PHP_EOL вместо \ r \ n в * Additional_headers *, т. Е. $ Заголовок в вашем примере. PHP_EOL заменит символ новой строки в соответствии с операционной системой, в которой вы работаете.

Кроме того, сообщение должно содержать только LN, т. Е. \ N. Это соответствует документации PHP. Каждая строка должна быть разделена LF (\ n). Строки не должны быть длиннее 70 символов.

Убедитесь, что вы удовлетворяете обоим критериям в вашем скрипте - я попытался достичь этого и, наконец, начал работать с конфигурацией Postfix по умолчанию.

3 голосов
/ 10 февраля 2010

Это почти на 100% не проблема Postfix, а что-то вызванное вашим кодом. Тело начинается после того, как пустой заголовок CRLF виден после заголовков.

Вам следует выбросить основной текст своей электронной почты и посмотреть, не случайно ли вы вводите дополнительный CRLF.

0 голосов
/ 15 июня 2011

Дальнейшее изучение этой проблемы (в основном потому, что я не хотел улучшать множество скриптов только из-за этого), я пришел к выводу, что существует сильный конфликт между разработчиками PHP и Postfix, который не устранен до сейчас. Вы можете прочитать подробную информацию здесь:

http://www.mail-archive.com/postfix-users@postfix.org/msg03226.html

Postfix ожидает, что EOL будет LF при получении почты из sendmail в unix и заменяет это на CRLF при отправке. Когда он получает CRLF, он все равно заменяет LF и мы получаем CRCRLF .

Это объясняет сломанные заголовки. Чтобы решить эту проблему, вы должны точно знать, как работает ваша система Postfix и PHP / mail. Если у вас возникли проблемы, подобные описанным выше, просто используйте «\ n» вместо «\ r \ n». Если вы программируете сложную систему, которая может работать как в Windows, так и в Unix, просто введите дополнительный параметр, например, $ eeol = "\ r \ n"; который будет помещен вместо прямого тега "\ r \ n", и его можно легко настроить для любой системы.

Полагаю, такой подход рекомендует автор Postfix:

Было бы очень хорошо, если бы программисты приложений PHP форматировали сообщения электронной почты согласованным образом. Например, они могли бы использовать переменную, которая содержит терминатор END-OF-LINE, вместо жестко кодирующих терминаторов строк LF или CRLF повсеместно.

...