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

时间:2013-07-19 10:06:19

标签: ruby-on-rails ruby actionmailer sidekiq

我在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
  • 运行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有关,但我不知道如何调试,一切似乎都有效,但电子邮件从未发送过。

4 个答案:

答案 0 :(得分:16)

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

RAILS_ENV=production bundle exec sidekiq -D

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

答案 1 :(得分:2)

我的设置与此相同:

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

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中的源代码

Action Mailer source

...我看到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上