在symfony2中每秒限制swiftmailer电子邮件

时间:2012-07-20 03:55:28

标签: php symfony amazon-web-services swiftmailer amazon-ses

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

我想设置假脱机程序,如this article中所述。我可以使用cron每分钟触发它,这对我的目的来说很好。不过,我担心的是,这个假脱机程序中会有大量的电子邮件排队,而我的服务器会尝试一次性发送所有这些邮件。

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

有没有办法限制从假脱机程序发送的电子邮件的费率?

2 个答案:

答案 0 :(得分:4)

更好的解决方案

使用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显然是更明智的选择,尽管第二种解决方案通常会更加密集。

答案 1 :(得分:2)

现在,你可以使用配置防洪与swiftmailer(参见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封电子邮件