1

在创建使用 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导致重复的回车。一些邮件服务器然后将其替换为额外CRCRLF换行符,并且所有标题(在这种情况下为 之后From:)现在都是邮件正文的一部分。

PHP 实际上插入了X-PHP-Originating-Script带有错误行尾的标题,这是一个附带问题,但仍然很烦人。– 实际上是一个 PHP 5.3 错误,现已修复。

关于处理这个跨平台的理想方式的任何想法?

谢谢,

阿隆

4

1 回答 1

1

这是早期 5.3 版本中的一个相当短暂的缺陷,请参阅此错误通知

升级你的 PHP

于 2010-07-16T12:24:04.777 回答