创建使用PHP mail()
函数发送电子邮件的脚本时,我遇到了新行的问题。 Unix系统上的PHP希望标题用LF
字符分隔,不管the docs说什么, sendmail 然后用正确的CRLF
替换它们。但是在Windows上,消息和标头按提供的方式发送。这是在long running PHP bug report中描述的。
所以我需要一种方法来检测系统是否运行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
标题,其中包含错误的行结尾,这是一个副作用但仍然很烦人。
关于处理这个跨平台的理想方式的任何想法?
谢谢,
阿隆