PHP8 邮件函数添加 space 前缀到 headers

PHP8 mail function adding space prefixes to headers

我刚刚从 PHP 7.4 升级到 8.0。所有突然发出的邮件都以 spaces 为自定义 headers 的前缀。

代码如下:

$headers = [
    'From: Somebody <somebody@example.com>',
    'Content-Type: text/html; charset="UTF-8"',
];
mail('foo@example.com', 'Subject', 'Body', implode("\n", $headers));

升级前收到的消息如下所示:

To: foo@example.com
Subject: Subject
From: Somebody <somebody@example.com>
Content-Type: text/html; charset="UTF-8"
Message-Id: <E1n1vlx-0002C5-FC@hostname>

Body goes here

升级后,相同的代码向接收者发送如下所示的消息:

From: somebody@example.com
X-Google-Original-From: Somebody <somebody@example.com>
 Content-Type: text/html; charset="UTF-8"
To: somebody@example.com
Subject: Subject
Message-Id: <E1n20bv-0007st-Eh@hostnme>

Body goes here

Content-Type header 开始添加 space,因此邮件客户端会忽略它。 exim4 没有任何完整传出消息的日志,所以我不确定下一步该去哪里。

我认为 $headers 不应该是数组,只需使用简单的字符串即可。您可以在此处查看示例 #2 https://www.php.net/manual/en/function.mail.php

对内爆使用 \r\n 而不是 \n -- RFC5321 明确指定 CRLF 作为行终止符。我注意到 Gmail 在您指定的两个 header 行之间添加了这个 X-Google-Original-From header:

From: somebody@example.com
X-Google-Original-From: Somebody <somebody@example.com>
 Content-Type: text/html; charset="UTF-8"

我敢打赌 space 是 Google 试图在你的两个之间插入这一行的产物,但实际上不是你的两个,因为行结尾不正确。