我正在使用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;
}
}
答案 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封电子邮件。但是你可以随着时间的推移增加这个数字,直到你达到最佳位置。