3

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

我想设置一个假脱机程序,如本文所述。我可以使用 cron 每分钟触发一次,这对我来说很好。不过,我担心的是,大量电子邮件将在此假脱机程序中排队,而我的服务器将尝试一次将它们全部发送。

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

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

4

2 回答 2

4

更好的解决方案

使用 Throttler 插件 /fairly/ 很简单。

我将使用 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 显然是更明智的选择,尽管第二个分辨率通常会更密集地跟踪。

于 2012-07-20T04:04:25.740 回答
2

现在,您可以将配置 antiflood 与 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 封电子邮件

于 2015-12-16T12:26:03.870 回答