2016-06-08 118 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

“这方面的消息太多”表明你最好强制一个新的连接。 –

相关问题