【问题标题】:Sending cross platform emails with PHP, how to handle line breaks?使用 PHP 发送跨平台电子邮件,如何处理换行符?
【发布时间】:2010-07-16 11:16:57
【问题描述】:

在创建使用 PHP mail() 函数发送电子邮件的脚本时,我遇到了换行问题。 Unix 系统上的 PHP 期望标题用 LF 字符分隔,尽管 the docs 说什么,sendmail 然后用正确的 CRLF 替换这些。但是,在 Windows 上,消息和标头按提供的方式发送。这在 long running PHP bug report 中有所描述。

所以我需要一种方法来检测系统是否正在运行 Unix 版本的 sendmail 以便在 Windows 上使用 LFCRLF。我知道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 的一个错误,现已修复。

关于处理这个跨平台的理想方式有什么想法吗?

谢谢,

阿隆

【问题讨论】:

    标签: php email cross-platform sendmail eol


    【解决方案1】:

    这是早期 5.3 版本中的一个相当短暂的缺陷see this bug notice

    升级你的 PHP

    【讨论】:

    • 啊,谢谢,更新了我的问题以反映这一点。我仍在寻找一种方法来处理 Unix 和 Windows 上 mail() 所需的不同行尾
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2017-01-17
    • 2022-01-10
    相关资源
    最近更新 更多