Отправка межплатформенных писем с помощью PHP, как обрабатывать разрывы строк - PullRequest
1 голос
/ 16 июля 2010

При создании скрипта для отправки электронных писем с использованием функции 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

1 Ответ

1 голос
/ 16 июля 2010

Это был довольно временный дефект в ранних версиях 5.3 см. Это уведомление об ошибке

Обновите свой PHP

...