【问题标题】:Which line break in php mail header, \r\n or \n?php邮件标题中的哪个换行符,\r\n或\n?
【发布时间】:2011-05-23 20:57:23
【问题描述】:

我见过很多使用 php 邮件功能的例子。其中一些使用 \r\n 作为标题的换行符,一些使用 \n.

$headers = "From: Just Me\n"; 
$headers .= "Reply-To:  Just me <$email>\n"; 

$headers = "From: Just Me\r\n";
$headers .= "Reply-To:  Just me <$email>\r\n";

哪一个是正确的?

有时我遇到使用 \r\n 并且某些电子邮件客户端将部分标头解释为邮件文本(丢失这些标头信息)的情况 - 这是因为 \r\n 是错误的吗?

【问题讨论】:

    标签: php email header


    【解决方案1】:

    CRLF \r\n,应该按照php documentation来使用。此外,为了符合RFC 2822 规范,行必须由回车符分隔,CR \r 立即 后跟换行符,LF \n

    由于 \r\n 是 Windows 平台原生的,\n 是 Unix 原生的,因此您可以在 Windows 上使用 PHP_EOL­Docs 常量,这是脚本当前运行平台的适当换行符。

    【讨论】:

    • @Amber 哎呀!已编辑。谢谢你:)
    • 我想知道为什么有些邮件客户端将 \r\n 解释为两个换行符(雷鸟似乎就是其中之一)。
    • @Sam 不幸的是,我不完全确定。如果您偶然发现答案,请告诉我。
    • 这个答案不合逻辑:如果 php 文档和 RFC 明确要求使用 \r\n,那么在所有非 MS-Windows 平台上使用常量 PHP_EOL 肯定会违反这一点.为什么要使用它?使用文字\r\n,一切都很好。
    • 我注意到,当在邮件函数的 php $headers 参数(第 4 个参数)中使用 \r\n 时,我的本地 MTA(通过 sendmail 后缀)正在将 \n 转换为 \r\n。然后,生成的发送电子邮件包含 \r\r\n ,这会破坏某些客户端的标题。使用 PHP_EOL 的原因可能是因为 MTA 期望来自 sendmail 的本地行分隔符。这将是有意义的,在 unix 系统上,它需要将 \n 转换为 \r\n 以与 RFC 兼容。
    【解决方案2】:

    以防万一搜索引擎发现了这一点并避免了我所经历的挫败感:这是一个额外的好奇心。

    在 Linux 上的 php 5.2x 上,我在 php mail() 中的电子邮件标题上有 \r\n,在升级到 php 5.3.3 后,格式化和发送神秘地失败了。删除 \r 修复了脚本(在检查了许多其他可能性之后)。

    【讨论】:

    • 我也偶然发现了这个问题,通过用简单的换行符替换 CRLF 解决了这个问题
    • 这是因为他们将 \n 转换为 \r\n 所以当你使用 \r\n 输出将是 \r\r\n
    • 如果有帮助,我注意到在“Content-Transfer-Encoding: 7bit”子句之后,必须有两个 \r\n。
    【解决方案3】:

    如上所述,\r\n 是您应该根据 RFC 使用的内容,但这会破坏您在多个邮件系统(f.i. Outlook 2003)上的标头。尽管 \n 不是要使用的“正确”换行符,但根据我的经验,它在我迄今为止遇到的所有邮件系统上都能正常工作。因此,我总是只使用\n。

    【讨论】:

    • 电子邮件客户端列表,其中 \n 本身会导致标题被误解。将 \n 字符用作电子邮件标头值的一部分的电子邮件客户端程序员似乎很少见且愚蠢,因为 RFC 明确禁止这样做:“字段正文可能由任何 US-ASCII 字符组成,CR 除外和LF。” (第 2.2 节)。当终止标头的两个换行符之前有一个单独的 \n 时,客户端的行为是未定义的,因此使用 \n 作为标头值终止符比遵循 RFC 更明智。
    【解决方案4】:

    RFC 正式要求使用 CRLF (\r\n),但使用 Unix 中断 (\n) 作为标头会为您省去很多麻烦。某些邮件服务器,例如 qmail,如果使用 \r\n,将拒绝您的邮件。

    来源:经验,本笔记证实:http://www.php.net/function.mail#40204

    【讨论】:

    • 其实大家之所以说\r\n不行,\n行不行,是因为他们是在本地发送邮件的unix环境。这与使用 SMTP 将电子邮件直接发送到邮件服务器不同。
    【解决方案5】:

    我的经验: HTML 电子邮件在 Web 客户端中运行,但在基于 MS 的桌面客户端(随行人员、Outlook)中中断。正在使用 \r\n。仅删除了 MIME 版本上的 \r,现在可以全面使用。

    【讨论】:

      【解决方案6】:

      我遇到了 gmail 误解 \r\n 标题的问题,但在我的情况下,仅将标题换行符留在 \n 是不够的,因为在这种情况下,某些版本的 Outlook 将电子邮件显示为空。

      https://stackoverflow.com/a/7960957 中的解决方案(我选择从 ppa 在 lucid 上安装 postfix 2.9)加上使用 \n 似乎现在无处不在。

      【讨论】:

        【解决方案7】:

        我将我的脚本改为使用 PHP_EOL,这似乎可以工作——就像这样:

        //Set Content-type header
        $headers  = "MIME-Version: 1.0" . PHP_EOL;
        $headers .= "Content-type: text/html; charset=iso-8859-1" . PHP_EOL;
        //Additional headers
        $headers .= "From: $from" . PHP_EOL;
        $headers .= "Cc: $cc"   . PHP_EOL;      
        $headers .= "Content-type: text/html" . PHP_EOL;
        $headers .= "Bcc: $bcc" . PHP_EOL;
        

        注意。一定要我们 " 而不是 ' 因为后者似乎不起作用!

        【讨论】:

          【解决方案8】:
          > $mail = new PHPMailer;
           $mail->isSMTP(); 
          **$mail->isHTML(true);**
          

          工作后插入此代码

          > all html tag <br> <p> in $mail->Body='Hello<br> how are you ?<b>';
          

          【讨论】:

            猜你喜欢
            • 2013-12-02
            • 1970-01-01
            • 1970-01-01
            • 2012-08-03
            • 1970-01-01
            • 2010-12-20
            • 2011-10-29
            • 2011-08-22
            相关资源
            最近更新 更多