我正在努力從 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中。