2015-12-30 46 views
0

我使用SwiftMailer發送大量電子郵件。目前,我使用代碼使用Swiftmailer發送大量電子郵件

$transport = Swift_SmtpTransport::newInstance('*****', 25); 
$transport->setUsername('***'); 
$transport->setPassword('***'); 

$mailer = Swift_Mailer::newInstance($transport); 
$message = Swift_Message::newInstance(); 
$message->setSubject($derBetreff); 

$bbc= array('[email protected]','[email protected]','[email protected]',...,'[email protected]'); 

$message->setFrom(array('[email protected]' => 'My Name'));   
$message->setTo('[email protected]'); 
$message->setBcc($bcc); 
$message->setBody('Hi this is my email');   
$message->attach(Swift_Attachment::fromPath('myFile.pdf'));  

// Send the message 
$result = $mailer->send($message); 
echo $result; 

在那裏我只發送一封郵件給自己並在BCC中添加約1000人。

大約需要9分鐘執行代碼,併發送一個電子郵件地址和它返回一個「成功」的消息。但是,我的php.ini文件中的max_execution_time的僅設置爲30秒。

我的第一個問題是:爲什麼的max_execution_time無法阻擋我SwiftMailer腳本?

Secondy,我發現AntiFlood Plugin for Swiftmailer這有助於發送大量電子郵件。下面的腳本通過先發送100封電子郵件然後暫停30秒並繼續發送接下來的100封電子郵件等等,向每個成員發送一封電子郵件。我已經讀過,這是避免被標記爲垃圾郵件的好習慣。

我的第二個問題是:是否抗洪插件需要一個非常長的執行時間,以工作?例如,如果我發送1000封帶有下面腳本的電子郵件,並且只考慮暫停,那麼腳本已經運行了至少4.5分鐘,對吧?

// Create the Mailer using any Transport 
$mailer = Swift_Mailer::newInstance(
    Swift_SmtpTransport::newInstance('smtp.example.org', 25) 
); 

// Use AntiFlood to re-connect after 100 emails 
$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100)); 

// And specify a time in seconds to pause for (30 secs) 
$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100, 30)); 

// Continue sending as normal 
for ($lotsOfRecipients as $recipient) { 
    ... 

    $mailer->send(...); 
} 
+0

嗨,我需要完成這個確切的事情,你怎麼最終這樣做? –

+0

@LeeWiggins你可以安全地使用防洪插件,甚至更好的郵件查詢。我在這裏添加了一個答案:https://stackoverflow.com/a/47922195/2311074 – Adam

回答

0

首先,電子郵件的發送不會發生在腳本本身中。這就是爲什麼如果你的服務器在Linux上運行的max_execution_time不受影響,看到docs

的set_time_limit()函數的功能和配置指令 的max_execution_time隻影響腳本本身 的執行時間。確定最大 時間,該腳本已經運行時,房價不包括執行腳本的 外面發生諸如使用system()系統調用,流操作, 數據庫查詢等花費在活動的任何時間。在測量時間是真實的Windows 上,這不是真的。

因此,使用Anti-Flood插件是一次性發送多個郵件的好主意。

不過,我認爲更好的做法是存儲電子郵件的數據庫,並讓一個cronjob從數據庫中每Y個分鐘發送X郵件。這樣,您就沒有一個加載腳本,需要花費幾分鐘時間才能完成(如果頁面重新加載,則有重新發送的危險)。如果您使用像Laravel這樣的框架,那麼您可以使用內置的mail-query功能,該功能完全就是這樣。

0

要發送批量電子郵件,您應該使用像RabbitMQ這樣的代理服務。您必須創建2個隊列,一個用於彙集電子郵件,另一個用Swiftmailer發送電子郵件。每封電子郵件將是rabbitMq消息。

+0

我們成功地在每天發送數千封電子郵件的項目中使用此方法。應用程序寫入隊列,並忘記它。rabbitmq消費者閱讀請求並在有時間發送郵件時發送郵件, – crafter

+1

如果您的回答有更多實質性內容讓海報妨礙 – crafter

相關問題