【问题标题】:Rails Action Mailer with deliver_later on AWS在 AWS 上使用 Deliver_later 的 Rails Action Mailer
【发布时间】:2018-09-05 08:29:35
【问题描述】:

我的生产应用程序在 AWS 上运行,但在某些邮件上的活动作业存在问题 - deliver_later。我在开发中成功发送了所有带有deliver_later 的电子邮件,但在生产中有些不同。某些邮件程序与deliver_later 一起使用,但不是我的欢迎邮件程序(欢迎新用户)。所以我必须在这个欢迎邮件上设置deliver_now,让它真正发送电子邮件。

//doesn't work, email is not sent
UserMailer.welcome_email(self).deliver_later
//works
UserMailer.welcome_email(self).deliver_now

当我使用deliver_later 时,来自服务器的日志文件显示了这一点,仅此而已:

[ActiveJob] Enqueued ActionMailer::DeliveryJob(作业 ID: d7114-464e-4a90-9721-126650) 到带有参数的异步(邮件): "UserMailer", "welcome_email", "deliver_now", #>

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: ruby-on-rails amazon-ec2 rails-activejob


    【解决方案1】:

    deliver_now 一次发送一封电子邮件。

    如果您使用deliver_later,则必须使用 ActiveJob runner,例如Sidekiq,您可以看到这个gist Sending emails with ActionMailer and Sidekiq,也可以看到这个发送的基本Sidekiq 电子邮件。

    将要通过活动作业传递的电子邮件排入队列。当作业运行时,它将使用deliver_now 发送电子邮件。

    UserMailer.welcome_email(self).deliver_later(wait: 1.hour)
    

    method-i-deliver_later

    基本上,deliver_later 是异步的。当您使用此方法时,此时不会发送电子邮件,而是将其推送到作业队列中。如果作业未运行,则不会发送电子邮件。 deliver_now 将在此时发送电子邮件,无论工作的状态如何。 Here您可以查看交付方式的文档。

    【讨论】:

      【解决方案2】:

      您使用的是什么 ActiveJob 后端?

      • ActiveJob 提供异步执行但不提供异步本身。

      您需要使用一些异步后端,例如 sidekiqdelayed_job 或其他。

      【讨论】:

        【解决方案3】:

        这是因为您还没有设置时间,而rails 选择了默认时间。并且在日志文件中还显示尚未调用 Deliver_later 方法。

        尝试使用:

        UserMailer.welcome_email(self).deliver_later(wait: 1.minute)
        

        然后在一分钟后检查日志。

        【讨论】:

          【解决方案4】:

          如果你使用delayed_job,你必须运行rake jobs:work

          https://www.youtube.com/watch?v=AoGPaWEasxs

          【讨论】:

            猜你喜欢
            • 2015-12-13
            • 2012-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多