delayed_job不发送电子邮件但处理作业

时间:2013-08-11 09:39:18

标签: ruby-on-rails-3.2 delayed-job

我使用delayed_job中的代码示例发送简报:

class NewsletterJob < Struct.new(:subscribers)
  def perform
    subscribers.each { |subscriber| NewsletterMailer.newsletter(subscriber.id) }
  end
end

然后我在这里设置工作:

Delayed::Job.enqueue NewsletterJob.new(Subscriber.find(:all))

如果我不使用延迟工作,邮件会被发送,因此它可以正常工作。 如果我直接使用延迟作业,邮件将按如下方式发送:

NewsletterMailer.delay.newsletter(subscriber)

在数据库的jobs表中,以下是yaml:

--- !ruby/struct:NewsletterJob
subscribers:
- !ruby/ActiveRecord:Subscriber
  attributes:
    id: '54'
    email: someemail@gmail.com
    created_at: '2013-08-09 04:44:51.113258'
    updated_at: '2013-08-09 08:26:05.934564'
    token: quVI0dhxyyentB7TJ1IO6w
- !ruby/ActiveRecord:Subscriber
  attributes:
    id: '56'
    email: another@gmail.com
    created_at: '2013-08-11 09:29:22.000829'
    updated_at: '2013-08-11 09:29:22.000829'
    token: a-n-yijwi38_HvGFSmetmA

我使用MockSMTP在本地计算机上发送电子邮件。

出于某种原因,即使作品似乎处理作业,也不会发送电子邮件。

yaml有问题吗?

任何帮助表示我是NOOB

2 个答案:

答案 0 :(得分:2)

在邮件方法前面链接delayed时,您无需在其上调用deliver。延迟::约会为你照顾。

NewsletterMailer.delay.newsletter(subscriber) # No need to call `deliver` here

但是当你从自己的自定义作业结构中调用它时,你需要记住调用邮件程序的deliver方法:

subscribers.each do |subscriber|
  NewsletterMailer.newsletter(subscriber.id).deliver # You need `deliver` here
end

答案 1 :(得分:0)

最后,我需要使用camel case命名作业类并将其放在lib目录中。

#lib
NewsletterJob.rb

然后在#application.rb中,我不得不关闭自动删除失败的作业以查看发生了什么,并从lib中预加载文件

Delayed::Worker.destroy_failed_jobs = false
require "#{Rails.root.to_s}/lib/NewsletterJob.rb"

这一切都基于这里的答案 Delayed_job not executing the perform method but emptying the job queue