首页 文章

Swiftmailer只从BCC发送999封电子邮件

提问于
浏览
2

我正在使用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(Object(Swift_Message),'me@mydomain.n ......' ,Array,Array)#5 /is/htdocs/www/swift/lib/classes/Swift/Transport/AbstractSmtpTransport.php(178):Swift_Transport_AbstractSmtpTransport - > _ sendBcc(Object(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),Array)#7 /是/ 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

执行此代码时:

/*
 * 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 回答

  • 2

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

    密件抄送通过发送单个邮件在内部工作,每个收件人一个邮件,因此达到某些限制这样做是明智的 .

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

    $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

    我 Build 了一个系统,必须向多个人发送电子邮件,但没有收件人知道电子邮件发送给谁,收件人的数量可以是从10到50,000 .

    您应该瞄准的最终产品是在一个循环中发送电子邮件,以便它将电子邮件直接发送给您拥有的1,500个收件人中的每一个 . 这真的是摆脱困境的唯一途径 .

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

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

相关问题