2014-11-14 150 views
0

我每天發送一封郵件,每天發送給人員列表。我使用PHP和PHPMailer對象來發送電子郵件。SMTP錯誤問題 - PHPMailer

這一直工作正常,直到今天,當我沒有收到一封電子郵件(試驗),我檢查日誌以發現間歇我得到SMTP錯誤從

回來之類的
mail->Send(); 

方法對一些人 - 不是全部。

除了名稱和電子郵件地址外,所有電子郵件的大小(字符長度)完全相同。

$mail->ErrorInfo; 

錯誤細節包括這兩個錯誤

SMTP錯誤:數據不被接受。 <p> SMTP服務器錯誤:2.1.5好的

SMTP錯誤:數據未被接受。 < p & gtSMTP服務器錯誤:</P >

爲什麼有斷p標籤錯誤消息我不知道 - 也就是爲什麼第一個錯誤中有OK?

但是循環中的其他人有電子郵件出來罰款。

此外,當我把腳本放入測試模式時,只有這些失敗通過電子郵件發送出去(所以一次腳本調用=一封電子郵件給一個人),我發現沒有問題,人們得到了他們的電子郵件。

現在我問技術支持是什麼意思,並回到「谷歌它」,我無法找到任何地方的錯誤2.1.5。我真的不明白爲什麼它在錯誤之後說得好。

作爲明天的測試,我對失敗的發送進行了一次測試,然後再次嘗試進行5秒的測試。

我不知道這是否會有所幫助,但我認爲也許我的SMTP服務器與我的腳本(Rackspace VPS Linux)位於同一臺服務器上,並且存在臨時連接問題,因此在這種情況下睡眠可能非常方便。

這是我第一次遇到這個問題,我沒有重新啓動APACHE或我的服務器(或郵件服務器),在這個腳本之前我有另外一個發出403電子郵件沒有任何問題。

這將是很高興知道錯誤是什麼以及它爲什麼發生。

羅布

回答

0

被定義的錯誤正是你希望它是 - 在the RFC that defines SMTP error codes。 2.1.5表示「目標地址有效」。它以2開頭意味着它不是一個錯誤,而是一個響應代碼 - 警告和錯誤從4和5開始。爲什麼你明白了,我不知道,但它肯定似乎不是在這種情況下預期的。郵件服務器通常會遇到問題 - 磁盤空間不足,被垃圾郵件過濾淹沒,這就是郵件服務器有隊列的原因。直接使用PHPMailer的SMTP類發送不適合大批量發送 - 使用SMTP很好,但將其指向適當的(附近的)MTA可正確處理傳送。

至於亂碼ErrorInfo的內容,我懷疑您使用的是PHPMailer的舊版本 - 最近調試輸出已經清理完畢。最近更改的另一件事情是在單個發送給多個收件人(例如BCC)期間處理錯誤 - 現在它更有可能在沒有放棄的情況下到達長收件人列表的末尾。

+0

如果錯誤不是真的錯誤,那麼消息重試之間的睡眠也會有所幫助。我在看的響應代碼頁面沒有顯示2.1.5,所以我沒有看到任何提及。如果2表示「目標地址有效」,那麼.1和.5是什麼意思?無論如何要找出答案。難道它只是一個淹沒郵件服務器的情況嗎?在這種情況下,每個電子郵件發送和重試幫助之間會有更長的超時時間? – MonkeyMagix 2014-11-19 10:46:19

+0

它以「2」開頭表示它是成功代碼(請參閱第2節)。它後面的'.1'表示它是一個地址狀態(也是第2節),整個'* .1.5'模式在3.2節列出。並非所有的前綴和狀態組合都是有意義的 - 例如5.1.7對垃圾郵件過濾器的拒絕是有意義的,但是對於被垃圾郵件過濾器接受,2.1.7沒有任何意義! – Synchro 2014-11-19 15:01:39

+0

你可以嘗試設置'$ mail-> SingleTo = true;',它會分別發送每條消息(如果你設置了多個'to'地址),這可能會給你一個更精確的反饋。您也可以嘗試打開/關閉SMTPKeepAlive。除非你發送大量數據(數千個),否則增加延遲可能無濟於事。 – Synchro 2014-11-19 15:05:17