Sendmail

如果發送日期標題,智能主機不發送電子郵件?

  • November 21, 2014

我在 Amazon Linux 伺服器上使用 MantisBT 1.2.6。它有自己的電子郵件發送類,位於 PHP mail() 函式之上。實際上,它還有其他選項可以直接使用 smtp 或 sendmail,但我使用的是 PHP 郵件。然後 PHP 郵件又使用 sendmail。

我將 sendmail 配置為使用智能主機,它執行良好,因為我可以編寫一個小的 PHP 程序來通過其 mail() 函式成功發送消息。

但是 MantisBT 發送的郵件從未到達,也沒有退回。

/var/log/maillog顯示成功發送到智能主機的 MantiBT 消息

(relay=my-smarthost-hostname) with "stat=Sent (ok nnnn qp nnnn)"

如果我更改 /etc/mail/authinfo 文件以使用錯誤的密碼,郵件日誌會顯示該中繼的“stat=Service不可用”。

因此,問題似乎必須是 MantiBT 程式碼中的一些微妙之處。我使用 xdebug 來查找它對 mail() 的呼叫,並獲取其參數的值,並將它們提取到一個單獨的 php 文件中以供使用。除了第四個參數中的“From:”之外,它還傳遞了許多標頭,我懷疑它們可能只是被 \n 分隔,而不是 RFC (2)821 要求的 \r\n,這導致了問題. 但是我在標題字元串中添加了將 \n 更改為 \r\n 的程式碼,這沒有任何區別。

最後,導致問題的原因是存在(正確的)“日期:”標題。當我從第 4 個參數中刪除該標頭到 mail() 時,郵件立即送達。所以我編輯了 MantisBT 源不生成該標頭,一切都很好(我還編輯了 MantisBT 源,不在“-f”選項和發件人地址之間放置空格)。

所以我的問題是是否已知 mail() 的第四個參數中存在“日期:”標頭會導致通過智能主機發送問題。如果 smarthost 不喜歡看到 Date 標頭,您是否會期望在郵件日誌中出現退回郵件或消息?

PS 當我在郵件日誌中看到已發送的 ok 消息時,我實際上致電 Network Solutions 技術支持,但在我將其隔離到 Date 標頭之前。當然,這並沒有什麼用處,只是有關如何為 POP 或 IMAP 配置電子郵件客戶端的說明 :-)

顯然,我被自己的方法論所吸引。

現在看來,日期標頭導致消息被智能主機接受而不被傳遞的原因是我沒有在每次測試時更改標頭中的時間戳。因此,智能主機看到了多條具有相同消息 ID 和時間戳的消息,只是沒有傳遞重複的消息。

在使事情正常進行的過程中,我看到了將 -f 選項作為收件人地址的錯誤(可能是因為“-f”和發件人地址之間的空格),以及其他問題。所以有可能當我把這些東西修好時,一條消息就可以通過了。但隨後嘗試確認成功卡在重複消息陷阱中。當然,在現實生活中,時間戳永遠不會與消息 ID 重複,這只是將傳遞給 mail() 的參數擷取到獨立的靜態測試案例中的產物。

無論如何,我想我現在已經準備好了,我會將 Date 標頭恢復到 MantisBT 程式碼。

以前沒有玩過發送郵件,這對我來說是一次學習經歷。也許這對其他人有用,要知道如果你想測試外發郵件,你不能使用帶有不變 MessageID 和 Date 標頭的罐頭標頭!

引用自:https://serverfault.com/questions/645916