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

时间:2010-12-11 07:52:42

标签: php email

当我使用\ r \ n发送来自php的邮件作为标题中的换行符(as it should be according to documentation

$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);

某些邮件客户端会将\ 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>

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

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

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

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:0)

如前一个问题所述。每个平台以不同的方式(CRLF或LF)界定线条。最好通过PHP_EOL常量将此决定留给PHP,PHP将负责处理它。

答案 2 :(得分:0)

在您的代码中,您对某些标题行使用\ r \ n,而对其他标题行仅使用\ n \ n。如果你保持一致,也许不会出现这个问题。