我在rails 4应用程序中设置了sidekiq,用于发送电子邮件和处理后台作业。我还设计了我使用devise_async和典型的联系表单电子邮件。我正在使用Gmail发送电子邮件。
如果我删除sidekiq,它通常通过gmail(设计和联系表单)发送电子邮件,但是当我启用它时,它不起作用(devise_async既不是联系表单也不是)。 Sidekiq显示后台作业开始并成功完成(我也通过sinatra应用程序看到它们已被处理)但电子邮件从未发送过。
在开发过程中,控制台显示发送的电子邮件(使用devise_async和联系表单,因为它们已成功处理sidekiq)。
我已尝试过的内容:
bundle exec sidekiq
但没有任何效果。我使用的是ruby 2.0.0-p247。
我还在此应用程序中使用sidekiq设置图像处理,在开发和生产中都能很好地工作。
我没有做任何花哨的事情,但我正在添加完成代码:
我的邮件代码:
def send_message
@message = Message.new(message_params)
if @message.save
ContactMailer.delay.contact_form(@message.id)
end
end
我的邮件:
def contact_form(message_id)
message = Message.where(id: message_id).first
@email = message.email
@message = message.text
mail(to: "myemail@gmail.com", subject: "Message from contact form")
end
和我的生产配置(它没有sidekiq工作):
config.action_mailer.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:domain => "gmail.com",
:authentication => "plain",
:enable_starttls_auto => true,
:user_name => "myusername",
:password => "mypassword"
}
config.action_mailer.default_url_options = { :host => "mydomain.com" }
这里有一个典型的sidekiq队列:
/home/john/.rvm/gems/ruby-2.0.0-p247@cluey/bundler/gems/sidekiq-4ed6eba8aff1/lib/sidekiq/rails.rb:14: warning: toplevel constant Queue referenced by Sidekiq::Client::Queue
2013-07-19T09:47:56Z 20112 TID-1a5mkc INFO: Booting Sidekiq 2.5.2 with Redis at redis://localhost:6379/0
2013-07-19T09:47:56Z 20112 TID-1a5mkc INFO: Running in ruby 2.0.0p247 (2013-06-27 revision 41674) [i686-linux]
2013-07-19T09:47:56Z 20112 TID-1a5mkc INFO: See LICENSE and the LGPL-3.0 for licensing details.
2013-07-19T09:47:56Z 20112 TID-1a5mkc INFO: Starting processing, hit Ctrl-C to stop
2013-07-19T09:48:11Z 20112 TID-1u2z02 Devise::Async::Backend::Sidekiq JID-4a7e66a14deab112191e4b49 INFO: start
2013-07-19T09:48:12Z 20112 TID-1u2z02 Devise::Async::Backend::Sidekiq JID-4a7e66a14deab112191e4b49 INFO: done: 1.214 sec
2013-07-19T09:48:50Z 20112 TID-1u2z02 Devise::Async::Backend::Sidekiq JID-32191822b789f5b6896a5353 INFO: start
2013-07-19T09:48:51Z 20112 TID-1u2z02 Devise::Async::Backend::Sidekiq JID-32191822b789f5b6896a5353 INFO: done: 0.143 sec
2013-07-19T09:49:29Z 20112 TID-1u2z02 Sidekiq::Extensions::DelayedMailer JID-c1911e0c4b72295dc067d57f INFO: start
2013-07-19T09:49:29Z 20112 TID-1u2z02 Sidekiq::Extensions::DelayedMailer JID-c1911e0c4b72295dc067d57f INFO: done: 0.152 sec
我认为这与actionmailer和sidekiq有关,但我不知道如何调试,一切似乎都有效,但电子邮件从未发送过。
答案 0 :(得分:16)
我找到了,你必须像这样运行sidekiq:
RAILS_ENV=production bundle exec sidekiq -D
在生产中运行。这与资产预编译的问题相同。
答案 1 :(得分:2)
我的设置与此相同:
我运行邮件程序的代码运行正常并且没有任何错误退出 - 但没有做任何事情,也没有发送电子邮件。来自我的邮件:
logger.debug "about to mail"
logger.debug Rails.application.config.action_mailer.sendmail_settings.inspect
mail(to: purchase.email, subject: 'Your key')
logger.debug "mail done!"
该代码是从sidekiq作业调用的。我可以在rails日志中看到来自调试行的消息,确认调用了这行代码。我还看到sendmail_settings的值,确认设置是来自development.rb的设置。
所以,只是为了咯咯笑,我在development.rb中将设置更改为:
config.action_mailer.sendmail_settings = { :location => '/bogus/doesnt/exist' }
当然,在每次更改后,我都会清除webroot并完全重新加载应用程序,然后重新启动我的服务器。
现在我看到调试行打印出伪配置值,并且邮件(...)函数仍在执行而没有任何错误。尽管如此,这仍然是
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
在配置中设置(并确认为由调试行设置)。我的邮件模板被渲染,整个过程都有效,但sendmail命令永远不会被执行,甚至不会被尝试。
然后我查看了Mail和ActionMailer的/ var / lib / gems中的源代码
...我看到mail(...)函数以“m”结尾 - 所以它返回Mail对象。我无法在邮件实际发送的邮件(...)函数中看到任何地方。
我将调试日志行添加到ActionMailer gem中的send(...)函数中,我在日志中看到了这一点。我将调试添加到Mail gem中的smtp传递函数,并且从未调用过。
所以我尝试在返回的对象上调用“deliver”:
outmail = mail(to: purchase.email, subject: 'Your key')
outmail.deliver
现在,我的邮件有效。我不知道这里发生了什么。如果这对其他人有用,我希望它有所帮助。我浪费了一天的开发时间,所以我只是把它当作“工作”并检查它。
答案 2 :(得分:1)
实际上我在使用rails 4版本时遇到同样的问题。上面的解决方案不适合我。所以,我尝试了sidekiq邮件宝石https://github.com/andersondias/sidekiq_mailer并让它运作良好!
答案 3 :(得分:0)
对于任何可能从中受益的人,我都像这样运行sidekiq:
worker: bundle exec sidekiq -q default -q mailers -t 25 -c 3 ...
使用heroku
在Procfile上