Sidekiq和rails 4 actionmailer永远不会发送电子邮件

我在rails 4应用程序中设置了sidekiq,用于发送电子邮件和处理后台作业。 我还设计了我使用devise_async和典型的联系表单电子邮件。 我正在使用Gmail发送电子邮件。

如果我删除sidekiq,它通常通过gmail(设计和联系表单)发送电子邮件,但是当我启用它时,它不起作用(devise_async都不是联系表单)。 Sidekiq显示后台作业开始并成功完成(我也通过sinatra应用程序看到它们已被处理)但电子邮件从未发送过。

在开发过程中,控制台显示发送的电子邮件(使用devise_async和联系表单,因为它们已成功处理sidekiq)。

我已经尝试过的:

  • 我为sidekiq的rails4添加了github分支(我也尝过了主人)
  • 我已经更新并检查redis版本是否大于2.4(它是2.6.14)
  • 我正在使用bundle exec 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有关,但我不知道如何调试,一切似乎都有效但电子邮件从未发送过。

我找到了,你必须像这样运行sidekiq:

 RAILS_ENV=production bundle exec sidekiq -D 

在生产中运行。 这与资产预编译的问题相同。

我的设置与此相同:

  • Rails 4
  • Ruby 1.9.3
  • 的ActionMailer
  • sidekiq
  • devise_async

我运行邮件程序的代码运行得很好,退出时没有任何错误 – 但没有做任何事情,也没有发送电子邮件。 从我的邮件:

 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中将设置更改为this:

 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对象。 我无法在邮件实际发送的邮件(…)function中看到任何地方。

我将调试日志行添加到ActionMailer gem中的send(…)函数中,我在日志中看到了这一点。 我将调试添加到Mail gem中的smtp传递函数,并且从未调用过。

所以我试着在返回的对象上调用“deliver”:

 outmail = mail(to: purchase.email, subject: 'Your key') outmail.deliver 

现在,我的邮件有效。 我不知道这里发生了什么。 如果这对其他人有用,我希望它有所帮助。 我浪费了一天的开发时间,所以我将把它当作“它工作”并检查它。

实际上我使用rails 4版本时遇到同样的问题。 上面的解决方案不适合我。 所以,我已经尝试了sidekiq邮件gemhttps://github.com/andersondias/sidekiq_mailer并让它运作良好!

对于任何可能从中受益的人,我像这样运行sidekiq:

worker: bundle exec sidekiq -q default -q mailers -t 25 -c 3 ...

在使用heroku的Procfile上