【问题标题】:Error: too many emails per second on Heroku错误:Heroku 上每秒发送的电子邮件过多
【发布时间】:2017-01-07 08:30:05
【问题描述】:

我在 Heroku 上有 rails 4 应用程序,通过 deliver_later 发送电子邮件。 Sidekiq 正在运行和工作,我的配置中有config.active_job.queue_adapter = :sidekiq

我还在日志[ActiveJob] [ActionMailer::DeliveryJob] 中看到了这一点,这让我相信电子邮件是作为后台作业发送的。

那么为什么我仍然会收到关于每秒发送过多电子邮件的错误消息?

Net::SMTPUnknownError: could not get 3xx (550: 550 5.7.0 Requested action not taken: too many emails per second

我刚刚注意到我将 sidekiq 并发设置为 3。也许这就是问题所在?

【问题讨论】:

    标签: ruby-on-rails email heroku smtp


    【解决方案1】:

    sidekiq 并发设置为 3 肯定是个问题。

    附加信息:将并发设置为 1 可以解决问题,但我不希望所有作业都由单个工作人员处理。如果 Sidekiq 允许每个队列使用 set concurrency 那就太好了,这样电子邮件可以使用单个工作人员,而其他工作可以使用多个工作人员。但是,sidekiq 作者说这是不可能的。

    我使用 heroku 找到了解决我的特定问题 here 的方法,其中包括将每个队列放在它自己的 heroku dyno 中,这样您就可以在每个 dyno 中设置并发。

    【讨论】:

      【解决方案2】:

      这不会与 Sidekiq 相关(嗯,不直接,反正)。这与您使用的任何 SMTP 服务器和服务器的速率限制有关。如果您有多个 Sidekiq 实例同时发送电子邮件,如果您的速率限制相对较低,则可能会引发此错误。

      例如,如果您在开发或临时环境中将 Mailtrap 用作 SMTP 服务器,则免费帐户每秒最多可发送 2 封电子邮件。很容易遇到这个错误。

      如果您出于自己的目的无法避免遇到此问题,您可以尝试几种不同的策略,方法是使用 ActionMailer 的 deliver_later method 的关键字参数“等待”,例如:

      users_i_need_to_email.each_with_index do |user, index|
        t = 5 * index
        UserMailer.send_important_stuff(user)
                  .deliver_later(wait: t.seconds)
      end
      

      如果您的 :deliver_later 调用在不同的流程或流程中运行,您可以通过随机化交付时间(例如,长达 5 分钟的随机时间)来摆脱困境。

      显然,上述两种解决方案都不能完全证明,因此您最好使用适合您的目的的 SMTP 服务器。

      【讨论】:

      • 是的,你说的都是真的。我的第一个解决方案是使用随机延迟,但感觉就像是 hack,我不喜欢这种延迟。所以现在我的解决方案是将我的邮件队列放入它自己的测功机中并将并发设置为 1。仍然是一个 hack……但感觉不那么 hacky……我猜。呵呵
      • 在 ActionMailer 中捕获错误并重试会很好——但我快速浏览了一下似乎还没有这个主题。不过这可能有效:使用 Sidekiq 作业来处理您的邮件,让作业使用“deliver_now”而不是“deliver_later”来调用您的邮件,并让 Sidekiq 捕获这些错误并重试。 (也似乎不自然:/)
      • 我们在另一个项目中也发生了类似的事情。 Sidekiq 已经重试错误一年多了,所以我们从来没有费心去修复它-_-
      猜你喜欢
      • 1970-01-01
      • 2019-08-29
      • 2016-05-20
      • 2015-02-12
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多