使用Swiftmailer批量发送电子邮件

时间:2015-12-30 12:19:04

标签: php swiftmailer bulk-email

我正在使用SwiftMailer发送批量电子邮件。目前,我使用代码

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

$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance();
$message->setSubject($derBetreff);

$bbc= array('1@web.de','2@web.de','3@web.de',...,'1000@web.de');

$message->setFrom(array('my@email.de' => 'My Name'));           
$message->setTo('my@email.de');
$message->setBcc($bcc);
$message->setBody('Hi this is my email');           
$message->attach(Swift_Attachment::fromPath('myFile.pdf'));     

// Send the message
$result = $mailer->send($message);
echo $result;

我只向自己发送一封电子邮件,并在BCC中添加约1000人。

执行代码并发送一封电子邮件需要大约9分钟才能恢复成功'信息。但是,我的php.ini文件中的 max_execution_time 只设置为30秒。

我的第一个问题是:为什么max_execution_time不会停止我的SwiftMailer脚本?

第二,我发现AntiFlood Plugin for Swiftmailer有助于发送批量电子邮件。下面的脚本通过先发送100封电子邮件,然后暂停30秒并继续发送下100封电子邮件等,向每位成员发送一封电子邮件。我已经读过,这是避免被标记为垃圾邮件的好习惯。

我的第二个问题是:AntiFlood插件是否需要非常长的执行时间才能工作?例如,如果我使用下面给出的脚本发送1000封电子邮件并且只考虑暂停,然后脚本已经运行至少4.5分钟,对吗?

// Create the Mailer using any Transport
$mailer = Swift_Mailer::newInstance(
  Swift_SmtpTransport::newInstance('smtp.example.org', 25)
);

// Use AntiFlood to re-connect after 100 emails
$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100));

// And specify a time in seconds to pause for (30 secs)
$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100, 30));

// Continue sending as normal
for ($lotsOfRecipients as $recipient) {
  ...

  $mailer->send( ... );
}

2 个答案:

答案 0 :(得分:1)

首先,发送电子邮件不会发生在脚本本身。这就是为什么如果您的服务器在Linux上运行,max_execution_time不会受到影响,请参阅docs

  

set_time_limit()函数和配置指令   max_execution_time仅影响脚本的执行时间   本身。花在执行之外的活动上的任何时间   使用system(),流操作等系统调用的脚本   确定最大值时不包括数据库查询等   脚本运行的时间。在Windows上不是这样   测量时间是真实的。

因此,当您一次发送多封邮件时,使用Anti-Flood插件是个好主意。

但是,我认为更好的做法是将电子邮件存储在数据库中,让cronjob每隔Y分钟从数据库发送一封X邮件。这样,您就没有在您面前花费几分钟的加载脚本(如果重新加载页面,则包含重新发送的危险)。如果你使用像Laravel这样的框架,那么你可以使用内置的mail-query功能,它就是这样做的。

答案 1 :(得分:0)

要发送批量电子邮件,您应该使用像RabbitMQ这样的Broker服务。您必须创建2个队列,一个用于汇集电子邮件,另一个用于通过Swiftmailer发送电子邮件。每封电子邮件都是一封rabbitMq消息。