Swiftmailer只从BCC

时间:2016-06-08 08:22:54

标签: php email swiftmailer

我正在使用Swiftmailer PHP版本4.3.0,我希望在BCC中发送一封包含1500个电子邮件地址的电子邮件。

我服务器的限制允许我可以在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 /is/htdocs/www/swift/lib/classes/Swift/Transport/AbstractSmtpTransport.php(281):   Swift_Transport_AbstractSmtpTransport-> _assertResponseCode(' 421)   很多我......',数组)

     

#1 /is/htdocs/www/swift/lib/classes/Swift/Transport/EsmtpTransport.php(245):   Swift_Transport_AbstractSmtpTransport-> executeCommand(' MAIL FROM:   executeCommand(' MAIL FROM:_doMailFromCommand(' me@mydomain.n ......')

     

#4 /is/htdocs/www/swift/lib/classes/Swift/Transport/AbstractSmtpTransport.php(466):   Swift_Transport_AbstractSmtpTransport-> _doMailTransaction(对象(Swift_Message),   ' me@mydomain.n ...',Array,Array)

     

#5 /is/htdocs/www/swift/lib/classes/Swift/Transport/AbstractSmtpTransport.php(178):   Swift_Transport_AbstractSmtpTransport-> _sendBcc(对象(Swift_Message),   ' me@mydomain.n ...',Array,Array)

     

#6 /is/htdocs/www/swift/lib/classes/Swift/Mailer.php(86):Swift_Transport_AbstractSmtpTransport-> send(Object(Swift_Message),   阵列)

     

#7 /is/htdocs/www/swift/lib/swift_required.php(133):Swift_Mailer-> send(Object(Swift_Message))

     

#8 /is/htdocs/www/mydomain.net/test.php(21):sendMessage()

     

#9 {main}

执行此代码时:

/*
 * 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("test1@mydomain.net","test2@mydomain.net", ... , "test1500@mydomain.net")

  // 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('me@mydomain.net' => 'My Name'));

  $message->setTo("specialMail@mydomain.net");

  $message->setBcc($bcc);

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

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

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

2 个答案:

答案 0 :(得分:2)

该邮件来自远程SMTP服务器。您的邮件托管帐户可能每天接受10000封邮件,但这与您可能拥有的其他限制完全无关(收件人总数,每封邮件的收件人数,每个连接的邮件数,邮件大小,允许的发件人数......)。

Bcc通过发送单个邮件在内部工作,每个收件人一个邮件,因此达到某种限制是明智的。

将收件人列表拆分成块并发送邮件的多个副本应该不难:

$all_bcc = array("test1@mydomain.net","test2@mydomain.net", ... , "test1500@mydomain.net");

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

答案 1 :(得分:1)

我建立了一个系统,必须向多个人发送电子邮件,但收件人不知道电子邮件发送给谁,收件人的数量可以是10到50,000之间。

您应该瞄准的最终产品是在一个循环内发送电子邮件,以便将电子邮件直接发送给您拥有的1,500个收件人。这真的是解决困境的唯一方法。

使用此方法,您可能会发现自己违反了批量邮件发件人(例如SendGrid,Mailgun等)设置的规则,这些规则限制了您每小时发送的电子邮件数量。

在我的情况下,我在数据库中创建了一条记录,其中包含所有电子邮件信息和收件人信息(因此您将创建1,500个单独的记录),然后创建一个每分钟运行一次的cronjob。 cronjob将运行电子邮件发送脚本,该脚本将发送大约15封电子邮件。但是你可以随着时间的推移增加这个数字,直到你达到最佳位置。