使用PHP发送跨平台电子邮件,如何处理换行符?

时间:2010-07-16 11:16:58

标签: php email cross-platform sendmail eol

创建使用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实际上插入了X-PHP-Originating-Script标题,其中包含错误的行结尾,这是一个副作用但仍然很烦人。 - 实际上是一个PHP 5.3错误,现在已修复。

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

谢谢,

阿隆

1 个答案:

答案 0 :(得分:1)

在早期的5.3版本see this bug notice

中,这是一个相当短暂的缺陷

升级你的PHP