我一直在试图弄清楚如何使用带有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
答案 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修复它。