在创建使用 PHP 函数发送电子邮件的脚本时,mail()
我遇到了新行的问题。Unix 系统上的 PHP 期望标题用一个LF
字符分隔,尽管文档说了什么,然后sendmail用正确的CRLF
. 但是,在 Windows 上,消息和标头按提供的方式发送。这在一个长期运行的 PHP 错误报告中有所描述。
所以我需要一种方法来检测系统是否运行了Unix版本的sendmail,以便在Windows上使用LF
和使用。CRLF
我知道,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 实际上插入了– 实际上是一个 PHP 5.3 错误,现已修复。X-PHP-Originating-Script
带有错误行尾的标题,这是一个附带问题,但仍然很烦人。
关于处理这个跨平台的理想方式的任何想法?
谢谢,
阿隆