我正在努力从 PHP 脚本发送电子邮件。当 mail()
函数被触发时,收件人的邮箱由特定服务 (seznam.cz) 托管,并且邮件被下载到邮件客户端 (Mozilla Thunderbird) 并且 ESET 防病毒软件会对其进行检查,消息似乎已损坏。
我认为,该问题是由防病毒软件在邮件消息中插入特殊标头并在其后留下空行引起的:
... Subject: =?UTF-8?B?Tm92w70gxI1sZW4gd2VidSBBU1AgxIxSIQ==?= X-EsetId: 37303A298C7FEE69657363 X-PHP-Originating-Script: 80:script.php MIME-Version: 1.0 Content-type:text/html;charset=UTF-8 ...
我的电子邮件客户端认为该消息是纯文本,并且以行 X-PHP-Originating-Script
开头。消息的其余部分包括所有 HTML 标记。
这是我用来发送电子邮件的脚本:
$subject = mb_encode_mimeheader('Subject text'); $emailBody = '<!DOCTYPE html> <html lang="cs"> ... </html>'; $emailAltBody = "..."; $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n"; $headers .= 'From: <email.address@example.com>' . "\r\n"; $result = mail("email.address@example.com", $subject, $emailBody, $headers);
但是,当使用 Laravel 框架时,电子邮件可以正确发送和显示。我比较了差异并意识到 X-PHP-Originating-Script
标头不是由 Laravel 发送的。
这可能是原因吗?我该如何解决它?
P粉5739437552023-09-08 00:38:50
这可能只是不同行分隔符的问题。
直到 PHP 7.4 X-PHP-Originating-Script 之后的分隔符只是 \n
(这已更改 在 PHP 8 中使用 \r\n
,甚至最近 在 master 中根据其他因素做出决定)。
由于所有其他标头都是使用 \r\n
连接的,因此防病毒软件在添加标头时可能会造成一些混乱。这会导致双换行,客户端将其解释为正文的开始。
使用显示所有字符(包括 \n
和 \r
)的编辑器查看原始消息,您可能会更好地理解它。
解决方案是匹配 PHP 版本的行尾,或者在所有设置 mail.add_x_header = Off
X-PHP-Originating-Script 标头> 在 php.ini 中。