2012-09-21 75 views
0

假設我們有一個包含通訊訂閱者的2000郵件列表,我們需要向他們發送大量電子郵件。發送電子郵件以防止垃圾郵件時,服務器確實有小時限制。使用SwiftMailer的Throttle Plugin會導致服務器斷開連接

有些人每小時有300或500個電子郵件,這是公平的。

當使用swiftmailer throttle插件發送每分鐘8封電子郵件(8 * 60分鐘= 480封郵件總數低於500的限制)時,服務器關閉連接並以「404 - 未找到頁面」響應。

奇怪的是,它在腳本執行過程中發送了100個或更少的電子郵件,但服務器仍將該過程視爲無限循環並終止腳本執行。

如果我嘗試一次發送500封郵件而沒有油門插件,它就像一個魅力。但是如果我需要發送更多像1500或2000這樣的電子郵件呢?

我讀過油門插件使用PHP的本地功能sleep()應該在這樣的情況下正常工作。

我被告知,如果通過Cron Job而不是通過HTTP協議執行進程,它可以工作。我試過用wget和curl來設置cron作業,但仍然沒有運氣。

我從我進行的研究中瞭解到,在Swiftmailer中使用SMTP服務器時,3秒處理需要28秒(比本應該更長)。所有查詢都經過優化,所有數據都正確放置在內存中,而不會使服務器過載。

之後,我決定在不使用SMTP的情況下給它一個鏡頭,但Throttler插件不能像它應該那樣工作(再次)。

任何意見或建議將不勝感激。

編輯:我也看到了這一點:SwiftMailer Batch email times my Server out

當然,我用這個:

ignore_user_abort(true); 
set_time_limit(0); 
ini_set('max_execution_time', 0); 
ini_set('memory_limit', '256M'); 
ini_set('mysql.connect_timeout', 500); 
ini_set('default_socket_timeout', 500); 

PS:我是被迫改劇本的行爲,現在,使其計算服務器的限制是基於每分鐘用戶輸入的電子郵件數量,如果活動用戶的總數小於或等於要發送的電子郵件數量,那麼它將發送它們而不使用油門插件。

向那, 喬治Girtsou

回答

3

我認爲,這與您的SMTP連接超時的事。

當您在循環中處理郵件並與Throttle插件結合使用時,Swiftmailer沒有機會關閉與SMTP服務器的連接,並且可能會限制ONE中發送的電子郵件數量單一連接。

這就是爲什麼建議將AntiFlood插件放入組合中,它會在x郵件發送後關閉SMTP連接,並等待y秒直到重新連接。

$transport->start()$transport->stop()是用於連接和斷開插件使用的SMTP服務器的手動方法。

對於SMTP傳輸,還有一個超時參數,可能對您很有意思。

將代碼放在try {} catch {}中可以很好地處理錯誤,這也很好。

希望這會有所幫助,即使這對你來說有點晚了!

相關問題