当我使用\r\n作为邮件头中的换行符(根据文档应该是这样的)发送PHP邮件时
$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 解释为两个换行符。因此,对于上述的 mail() 函数,实际的邮件内容应该是这样的:
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 是根据文档正确的换行符,还是其他原因造成了问题?
如何解决这个问题?将换行符从\r\n 改为\n似乎有所帮助,但由于文档说“应该使用\r\n”,这难道不是正确的解决方法吗?
PHP_EOL
常量。你尝试过使用它吗? - Russell Dias\n
转换为\r\n
的。 - Russell Dias\r\n
不一致。有些标题是以CRLF结尾的,而有些则只有LF。 - Thanatos