繁体   English   中英

使用Swiftmailer批量发送电子邮件

[英]Bulk Email with Swiftmailer

我正在使用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;

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

执行代码和发送一封电子邮件大约需要9分钟,然后返回“成功”消息。 但是,我的php.ini文件中的max_execution_time仅设置为30秒。

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

其次,我找到了Swiftmailer的AntiFlood插件,插件有助于发送批量电子邮件。 下面的脚本向每个成员发送一封电子邮件,方法是先发送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( ... );
}

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

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

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

但是,我认为更好的做法是将电子邮件存储在数据库中,并让cronjob每隔Y分钟从数据库发送X封邮件。 这样,您的加载脚本就不会花费几分钟的时间(包括重新加载页面时可能会重新发送的危险)。 如果使用Laravel之类的框架,则可以使用内置的邮件查询功能来实现。

要发送批量电子邮件,您应该使用像RabbitMQ这样的代理服务。 您必须创建2个队列,一个队列用于合并电子邮件,另一个队列使用Swiftmailer发送电子邮件。 每个电子邮件将是一个RabbitMq消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM