php邮件头中的哪个换行符,\ r \n或\n?

Sam*_*Sam 26 php email header

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

$headers = "From: Just Me\n"; 
$headers .= "Reply-To:  Just me <$email>\n"; 
Run Code Online (Sandbox Code Playgroud)

VS

$headers = "From: Just Me\r\n";
$headers .= "Reply-To:  Just me <$email>\r\n";
Run Code Online (Sandbox Code Playgroud)

哪一个是正确的?

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

Rus*_*ias 22

\r\n应该根据php文档使用CRLF .此外,为了符合RFC 2822规范线必须由回车符进行分隔,CR \r 立即随后换行,LF \n.

由于\r\nWindows平台和\nUnix 是原生的,因此您可以在Windows上使用PHP_EOLDocs常量,这是脚本当前运行的平台的相应新行字符.

  • 这个答案并不合乎逻辑:如果php文档和RFC专门请求使用`\ r \n`,那么使用常量`PHP_EOL`肯定会违反所有非MS-Windows平台.为什么要使用它?使用文字`\ r \n`,一切都很好. (14认同)
  • 我注意到在邮件功能(第四个参数)的php $ headers参数中使用\ r \n时,我的本地MTA(通过sendmail的后缀)将\n转换为\ r \n.然后,生成的已发送电子邮件包含\ r \n \n \n,它会在某些客户端上打开标题.也许使用PHP_EOL的原因是因为MTA期望来自sendmail的本地行分隔符.那么在unix系统上需要将\n转换为\ r \n才能与RFC兼容. (3认同)

小智 11

以防万一搜索引擎选择了这个并节省了其他人我遇到的挫折:这是一个额外的好奇心.

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


小智 8

如上所述,\ r \n是您应该根据RFC使用的内容,但这会破坏您在多个邮件系统上的标题(文件Outlook 2003).即使\n不是'正确'的换行符,根据我的经验,它在我到目前为止遇到的所有邮件系统上都能正常工作.因此,我总是只使用\n.

  • \n \n本身导致标题被误解的电子邮件客户端列表将非常有用.电子邮件客户端程序员似乎很少和愚蠢地将\n字符用作电子邮件标题的一部分,因为RFC明确禁止这样做:"字段正文可以由任何US-ASCII字符组成,CR除外和LF." (第2.2节).在终止标头的两个换行符之前有一个\n本身的客户端的行为是未定义的,因此使用\n作为标头值终止符比遵循RFC更明智. (2认同)