2010-11-10 42 views
1

我使用PHP的SwiftMailer庫批量發送電子郵件(在CANSPAM和RFC之後)。Sendmail在域MX不存在時掛起

一切正常,直到我運行一個在DNS中沒有對應MX條目的域。那時,我的腳本就掛了 - 我假設這是因爲sendmail沒有返回。這可以持續幾分鐘,或者可以持續幾個小時。

我已確認我的腳本(slash sendmail)掛在的地址是沒有DNS MX條目的地址。其他的一切都很好。

在我嘗試發送消息之前,有沒有一種方法可以檢查DNS MX是否存在於PHP內部?這是否可擴展(即,DNS上的額外查找是否真的讓我放慢了速度,或者它是否正常b/c,然後將MX緩存到本地以供sendmail用於傳遞郵件)?

感謝您的幫助

--- UPDATE --- 我嘗試以下解決方案,這讓我縮小問題是什麼。這似乎不是MX條目是否存在的問題。問題在於DNS查找將永遠返回。有沒有簡單的方法可以設置超時,所以如果DNS不返回< 5秒,我可以繼續嗎?

回答

3
getmxrr(substr($email,strrpos($email,'@')+1),$hosts); 
if (!$hosts) 
    echo 'No MX record found'; 

你也可以試試這個,以防止阻塞(有調整getmxrr超時無選項):

if ([email protected](substr($email,strrpos($email,'@')+1),25,$errno,$errstr,5)) 
    echo 'No MX record found'; 
+0

謝謝!這有助於;現在看來問題不在於它是否存在,而在於返回該值的滯後。更新了上面的問題,關於如何在5秒後使請求超時的任何建議? – 2010-11-10 19:37:34

+0

看到我的其他建議 – stillstanding 2010-11-10 19:48:28

+0

所以不會試圖打開一個套接字連接到電子郵件的域?我的問題是(經常)我發送到onedomain.com(可能有或沒有A記錄),但MX是for two.onedomain.com。所以,當我打開一個套接字時,它仍然不會(準確地)告訴我該電子郵件是否應該發送(它告訴我有一個關於onedomain.com的記錄,我真正想知道的是一個記錄[ MX查找]如果該域名有MX條目)。我是否認爲這兩件事不是一回事? – 2010-11-10 21:48:40

2

您可以使用getmxrr

if (getmxrr($hostname, $mxhosts)) { 
    // MX record exists 
    var_dump($mxhosts); 
} 
+0

謝謝!請參閱我對這個問題的更新 - 任何想法? – 2010-11-10 19:37:53

+0

'fsockopen'會做到這一點。請參閱[仍然上面的答案](http://stackoverflow.com/questions/4148135/sendmail-hangs-when-domain-mx-doesnt-exist/4148273#4148273)。 – netcoder 2010-11-10 20:07:40

1

DNS查找上很好地擴展重複的請求。最近的DNS服務器會將查找的值緩存一段時間。使用本地DNS緩存服務器可以提高性能,但會使用更多的內存(一點點或很多,具體取決於緩存的軟件和地址數量)。

如果我正確記得RFC,具有A記錄的主機應該是有效的但是,只有A記錄的域可能沒有該地址的郵件服務器(同樣適用於MX目標,但這應該不太頻繁,並且通常是暫時的。)

正確的電子郵件服務如果你的sendmail沒有這樣做,那麼你應該檢查它的配置,你還需要考慮如何處理電子郵件不能發送到的電子郵件地址