簡體   English   中英

在symfony2中限制每秒的swiftmailer電子郵件

[英]Limit swiftmailer emails per second in symfony2

我正在設置SES以使用SMTP2。 SES帳戶的限制之一(默認為至少)是每秒5封電子郵件。

我想要設置一個后台處理程序,如本文所述 我可以每分鍾使用cron觸發它,這對我來說很好。 不過,我擔心的是,此假脫機程序中將有大量電子郵件排隊,而我的服務器將嘗試一次發送所有電子郵件。

本文列出了一種方法,用於限制每次執行發送的電子郵件總數,以及限制執行時間的方法。 但是都不適合我的用例:限制每秒發送的電子郵件。

有什么方法可以限制假脫機程序發送電子郵件的速率?

更好的解決方案

使用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顯然是比較明智​​的選擇,盡管通常要跟蹤第二個分辨率會更高。

現在,您可以在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封電子郵件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM