限制symfony2中每秒发送的swiftmailer电子邮件


Limit swiftmailer emails per second in symfony2

我正在设置SES以使用SMTP2。SES帐户的限制之一(默认情况下至少)是每秒5封电子邮件的限制。

我想设置一个后台处理程序,如本文所述。我可以使用cron每分钟触发它,这对我来说很好。不过,我担心的是,大量电子邮件会在这个后台处理程序中排队,我的服务器会试图一次发送所有电子邮件。

本文列出了限制每次执行发送的电子邮件总数的方法,以及限制执行时间的方法。两者都不符合我的用例:限制每秒发送的电子邮件。

有没有办法限制从后台处理程序发送电子邮件的速率?

更好的解决方案

使用Throttler插件非常简单。

我将使用YML,因为这对我来说更理智:

您必须定义一组自定义服务。也许有一种/稍微/更好的方法可以做到这一点,但它应该有效。

首先,定义您的节流器服务:

services:
  my.throttler:
    class: Swift_Plugins_ThrottlerPlugin
    arguments: [300, 2]

现在定义您自己的邮件实例:

services:
  my.mailer:
    class: Swift_Mailer
    arguments: [@swiftmailer.transport]
    calls:
      - [ registerPlugin, [ @my.throttler ] ]

这将使您能够使用服务my.mailer以每秒5秒的速度发送受限制的电子邮件。

原始答案

您将不得不扩展默认的队列处理程序,使其能够在更高级的解决方案中工作。

Swift_Transport_SpoolTransport是您想要开始寻找的地方。

另一种选择是构建一个命令,通过后台进程服务运行,该后台进程服务使用参数--time-limit=1--message-limit=5运行默认假脱机。每次失败都会重新运行。

扩展SpoolTransport显然是一个更明智的选择,尽管第二个解决方案通常会更密集地进行跟踪。

现在,您可以使用带有swiftmailer的配置antiflood(参见。http://symfony.com/doc/current/reference/configuration/swiftmailer.html#antiflood)

示例

swiftmailer:
    transport: "%mailer_transport%"
    host:      "%mailer_host%"
    username:  "%mailer_user%"
    password:  "%mailer_password%"
    spool:
        type: file
        path: '%kernel.root_dir%/spool'
    antiflood:
        threshold:            1
        sleep:                1

这将每秒发送1封电子邮件