2016-06-08 120 views
1

我正在使用Swiftmailer PHP版本4.3.0,我想在BCC中發送一封包含1500個電子郵件地址的電子郵件。Swiftmailer只發送來自BCC的999封電子郵件

我的服務器上的限制允許我可以在24小時內發送多達10000封電子郵件。我沒有超過這個限制。

然而,當我嘗試使用Swiftmailer發送電子郵件返回以下錯誤消息(詳見下文)

「421個在這方面過多的信息」和BCC中的1500個電子郵件地址中只有999封電子郵件會收到該電子郵件。 我多次執行此實驗,同時將BBC中的電子郵件數量更改爲1000或2000 - 每次發送999封電子郵件。是否有可能在Swiftmailer的某處存在限制,它不允許在BCC中設置超過999個電子郵件地址?如果是這樣,是否有可能改變這個限制?如果不是,還有什麼可能導致這個問題?


這裏是Swiftmailer完整的錯誤消息:

異常「Swift_TransportException」有消息「期望的迴應 代碼250,但得到的代碼‘421’,在 消息「421個郵件太多該連接「」在 /is/htdocs/www/swift/lib/classes/Swift/Transport/AbstractSmtpTransport.php:386 堆棧跟蹤:

#0 /是/ htdocs中/ WWW /快捷/ lib中/班/雨燕/運輸/ A bstractSmtpTransport.php(281): Swift_Transport_AbstractSmtpTransport - > _ assertResponseCode( '421太 許多我......',陣列)

#1 /是/ htdocs中/ WWW /快捷/ lib中/班/雨燕/運輸/ EsmtpTransport .PHP(245): Swift_Transport_AbstractSmtpTransport-> executeCommand( 'MAIL FROM: executeCommand(' MAIL FROM:_doMailFromCommand('[email protected] ...')

#4 /是/ htdocs中/ WWW /迅速/lib/classes/Swift/Transport/AbstractSmtpTransport.php(466): Swift_Transport_AbstractSmtpTransport - > _ doMailTransaction(Object(Swift_Message), '[email protected] ...',Array,Array)

#5 /is/htdocs/www/swift/lib/classes/Swift/Transport/AbstractSmtpTransport.php(178): Swift_Transport_AbstractSmtpTransport - > _ sendBcc(對象(Swift_Message), 「[email protected] ... 」,陣列,陣列)

#6 /is/htdocs/www/swift/lib/classes/Swift/Mailer.php(86):Swift_Transport_AbstractSmtpTransport->發送(對象(Swift_Message) 陣列)

#7 /is/htdocs/www/swift/lib/swift_required.php(133):Swift_Mailer->發送(對象(Swift_Message))

#8 /is/htdocs/www/mydomain.net/test。PHP(21):的sendMessage()

#9 {主}

執行此代碼時:

/* 
* Autoloader and dependency injection initialization for Swift Mailer. 
*/ 

if (defined('SWIFT_REQUIRED_LOADED')) { 
    return; 
} 

define('SWIFT_REQUIRED_LOADED', true); 

//Load Swift utility class 
require dirname(__FILE__) . '/classes/Swift.php'; 

if (!function_exists('_swiftmailer_init')) { 
    function _swiftmailer_init() 
    { 
     require dirname(__FILE__) . '/swift_init.php'; 
    } 
} 

//Start the autoloader and lazy-load the init script to set up dependency injection 
Swift::registerAutoload('_swiftmailer_init'); 

sendMessage(); 

function sendMessage(){ 

try{ 

    // LARGE ARRAY with 1500 entries 
    $bcc = array("[email protected]","[email protected]", ... , "[email protected]") 

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

    // Create the Mailer using your created Transport 
    $mailer = Swift_Mailer::newInstance($transport); 

    // Create the message 
    $message = Swift_Message::newInstance(); 

    // Give the message a subject 
    $message->setSubject("This is a test mail"); 

    // Set the From address with an associative array 
    $message->setFrom(array('[email protected]' => 'My Name')); 

    $message->setTo("[email protected]"); 

    $message->setBcc($bcc); 

    $message->setBody("Hi, this is a test mail. Enjoy."); 

    $result = $mailer->send($message); 

    echo "Success"; 
} 
catch(Exception $exception) 
{ 
    echo $exception; 
} 
} 
+0

這是你的服務器的另一個限制,最多1000個目的地(在你的情況下1個主+ 999 BCC)。 – Gar

回答

1

我建立了一個系統,必須將電子郵件發送給多人,但沒有收件人知道電子郵件發送給誰,收件人的數量可以是從10到50,000的任何數字。

你應該瞄準的最終產品是一個循環內發送郵件,所以它直接發送電子郵件到每次有1500個收件人。這實際上是解決困境的唯一方法。

使用這種方法但是你會發現自己落入由羣發郵件發件人(如SendGrid,Mailgun等),誰限制你每小時發送的電子郵件的數量設置的規則犯規。

在我來說,我創建了一個記錄在數據庫中的所有的電子郵件信息和收件人信息(所以你會創造1500個單獨的記錄),然後創建一個cronjob運行每分鐘。 cronjob將運行電子郵件發送腳本,該腳本可以發送約15封電子郵件。但是隨着時間的推移,你可以增加這個數字,直到你達到最佳點。

+0

我想在我的情況可能會更好,以簡單地從Swiftmailer使用抗洪插件時,我想給每個接收者的個人電子郵件,而不是與數據庫中的變通方法。還有骯髒的選擇發送電子郵件兩次,第一封電子郵件與999 BCC電子郵件和第二封與501 BCC電子郵件。 – Adam

+0

各有利弊。就我而言,由於收件人數量衆多,需要在電子郵件傳遞方面保持良好的聲譽,這是我們取得巨大成功的過程。 – mickburkejnr

+0

有關cron-job的一個問題:它是否意味着它會始終(每天 - 每分鐘)檢查數據庫是否包含一行,如果是這樣,它會發送一封電子郵件?就我而言,我只會每月向1500個收件人發送一次電子郵件。因此,我想建立一個每分鐘執行一次的cronjob,對我的情況來說似乎有點過於誇張。 – Adam

1

這消息來自遠程SMTP服務器。您的郵件託管帳戶可能每天接受10000封郵件,但這與您可能擁有的其他限制(總收件人,每封郵件的收件人,每封連接的郵件,郵件大小,允許的發件人...)完全無關。

密件抄送內部工作通過發送單個郵件,每個收件人之一,因此它是明智的擊出了一些限制這樣做。

它不應該是很難塊分裂收件人列表和發送郵件的多個副本:

$all_bcc = array("[email protected]","[email protected]", ... , "[email protected]"); 

foreach (array_chunk($all_bcc, 999) as $bcc) { 
    $transport = Swift_SmtpTransport::newInstance('***', 25); 
    $transport->setUsername('***'); 
    // ... 
} 
+0

謝謝!我是否必須在foreach循環中創建傳輸?還是隻能在循環中創建新消息? – Adam

+1

「這方面的消息太多」表明你最好強制一個新的連接。 –

相關問題