Rails 3 / delayed_job - 通缉:延迟邮件的基本示例

时间:2010-12-21 20:05:36

标签: ruby-on-rails delayed-job

我一直在试图弄清楚如何使用带有rails 3的delayed_job发送延迟邮件。我已经尝试了几乎所有我认为可行的可能性组合 - 我可以让邮件在后台运行,我只是无法让它延迟发送到未来的时间。数据库中的delayed_jobs表清除任务,日志显示为“已发送”,delayed_job任务处理器选择任务&说发送没有失败......但邮件是:

  • 立即发送,或
  • 根本没有到达

如果我以后尝试发送。

如果有人能够提供将来发送邮件的rails 3 delayed_job的简单示例,我会非常感激。我相信很多人这样做,所以我怀疑我错过了一些明显的东西。我在下面尝试过的一种(无数种)组合:

delayed_job:2.1.2 rails:3.0.3 actionmailer:3.0.3

控制器:

class TestmailerController < ApplicationController
  def index
    Testmailer.delay.test_mail
  end

end

邮件程序:

class Testmailer < ActionMailer::Base
  def test_mail
    mail(:to => '(myemailaddress@removedforprivacy.com', :from => '(removedforprivacy)@gmail.com', :subject => 'Testing Delayed Job', :content_type => 'text/plain').deliver
  end
  handle_asynchronously :test_mail, :run_at => Proc.new { 2.minutes.from_now }


end

config / environments / development.rb的相关邮件部分:

  # Don't care if the mailer can't send
  config.action_mailer.raise_delivery_errors = true

  # Print deprecation notices to the Rails logger
  config.active_support.deprecation = :log

  config.action_mailer.default_url_options = { :host => 'localhost:3000' }

  ActionMailer::Base.smtp_settings = {
    :address => "smtp.gmail.com",
    :port => 587,
    :domain => "gmail.com",
    :user_name => "(removedforprivacy)",
    :password => "(removedforprivacy)",
    :authentication => "plain",
    :enable_starttls_auto => true
  }

工作指令:

rake jobs:work

3 个答案:

答案 0 :(得分:13)

我同意andrea - 我遇到了这个问题,在将本地开发数据库从sqlite切换到mysql之后,我可以运行像

这样的代码
Emailer.delay({:run_at => 5.minutes.from_now}).welcome(@user)

并在5分钟后发送电子邮件。请注意,您可能需要比五分钟更长的延迟(如果遇到时区怪异),以确保它正常工作。

答案 1 :(得分:1)

使用.delay方法和设置handle_asynchronously :test_mail都是多余的。尝试从代码中删除.delay方法。简单地使用

Testmailer.test_mail   # without .deliver due to a delayed_job issue

但是,我对您的配置进行了一些测试,当使用 sqlite 时,run_at被忽略(不知道原因),但使用 mysql2 时一切正常。

答案 2 :(得分:1)

我在Rails 3中找到mongoid,删除handle_asynchronously行使其工作。我遇到了各种各样的问题,似乎delayed_job没有识别我的Emailer类中的任何对象。删除handle_asynchronously修复它。