从php发送邮件:标题被解释为正文?

Sam*_*Sam 3 php email

当我从php发送带有\ r \n的邮件作为标题中的换行符(因为它应该根据文档)

$headers = "From: $email\r\n"; 
$headers .= "Reply-To:  Just me <$email>\r\n"; 
$headers .= 'Content-type: text/plain; charset=iso-8859-1' . "\r\n";
$headers .= "Content-Transfer-Encoding: 8bit\r\n";
$subject = "Hello world";
$body = "<html><p>Hey, whats up?</p></html>";

mail($to, $subject, $body, $headers);
Run Code Online (Sandbox Code Playgroud)

某些邮件客户端会将\ r \n解释为两个换行符.因此,对于上面的邮件(),真正的邮件内容将如下所示:

X-Message-Delivery: Vj0LEdMMtPAYT0xO0Q9MTtTQ0w9MA==
X-Message-Status: n
Received: from server75.publicompserver.de ([92.43.108.63]) by snt0-mc2-f13.Snt0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675);
 Thu, 9 Dec 2010 12:09:22 -0800
Message-ID: <40177C.70807@justme.org>
[lots of other headers]
Date: Thu, 09 Dec 2010 21:09:32 +0100
X-OriginalArrivalTime: 09 Dec 2010 20:09:22.0873 (UTC) FILETIME=[F88C3A90:01CB97DC]
From: $email

Reply-To:  Just me <$email>

Content-type: text/html; charset=iso-8859-1

Content-Transfer-Encoding: 8bit

<html><p>Hey, whats up?</p></html>
Run Code Online (Sandbox Code Playgroud)

现在一些客户(例如googlemail)会忽略这些额外的换行符.其他人(thunderbird)会将第一个额外的换行符解释为标题的结尾,并将其余的标题行解释为正文的一部分(丢失标题信息,在这种情况下将邮件呈现为文本而不是html).

我也从其他邮件发送网站看到了同样的问题.

这里发生了什么?\ r \n根据doc是正确的换行符,还是其他出错的地方?它怎么解决?将换行符更改为\n而不是\ r \n似乎有所帮助,但由于文档说"你应该使用\ r \n"这不可能是正确的,可以吗?

jco*_*ctx 8

这在http://php.net/manual/en/function.mail.php的文档中提到:"如果没有收到消息,请尝试仅使用LF(\n).一些劣质的Unix邮件传输代理取代由CRLF自动填充LF(如果使用CRLF,则会导致CR加倍).这应该是最后的手段,因为它不符合»RFC 2822.

所以,正如你所说:这不对,但这是现实.

  • 我的猜测是,为了获得最大的兼容性,只需使用\n,RFC就会被诅咒,只要你的测试显示没有问题. (2认同)