При создании скрипта для отправки электронных писем с использованием функции PHP mail()
у меня возникают проблемы с новыми строками. PHP в системах Unix ожидает, что заголовки будут разделены символом LF
, несмотря на то, что документы говорят, sendmail затем заменяет их на правильные CRLF
. Однако в Windows сообщение и заголовки отправляются как указано. Это было описано в долгосрочном отчете об ошибках PHP .
Поэтому мне нужен метод определения того, работает ли в системе версия Unix sendmail , чтобы использовать LF
и использовать CRLF
в Windows. Я знаю о PHP_EOL
, но мне интересно, есть ли более элегантный способ справиться с этим.
В настоящее время я создаю свое сообщение, как указано в документации, вот так.
<?php
$to = "example@website.com";
$subject = "Email Subject Here";
$message = "Hello this is a plaintext\n message with a line break.";
$headers = array(
"From: webmaster@example.com",
"Reply-To: webmaster@example.com",
"X-Mailer: PHP/" . phpversion()
);
$success = mail($to, $subject, $message, join("\r\n", $headers));
if ($success) {
echo "Mail Sent\n";
} else {
echo "Mail Failed\n";
}
В системах Unix это приводит к отправке следующего сообщения на sendmail (\r
и \n
заменены текстовыми представлениями):
To: example@website.comLF
Subject: Email Subject HereLF
X-PHP-Originating-Script: 501:mail.phpLF
From: webmaster@example.comCRLF
Reply-To: webmaster@example.comCRLF
X-Mailer: PHP/5.3.1LF
LF
Hello this is a plaintextLF
message with a line break.LF
Когда это передается sendmail , все LF
заменяются на CRLF
, что приводит к дублированию возвратов каретки. Некоторые почтовые серверы затем заменяют этот дополнительный CR
на CRLF
, что приводит к дополнительному разрыву строки, и все заголовки, в данном случае после From:
, теперь являются частью тела сообщения.
PHP фактически вставляет заголовок X-PHP-Originating-Script
с неправильным окончанием строки, что является побочной проблемой, но все же раздражает. - На самом деле ошибка PHP 5.3, теперь исправленная.
Есть идеи по поводу идеального способа обращения с этой кроссплатформенной платформой?
Спасибо
Aron