2013-07-19 34 views
12

我已经在rails 4应用程序中设置sidekiq来发送电子邮件和处理后台作业。我还设计了我正在使用devise_async和一个典型的联系人表单电子邮件。我使用Gmail来发送电子邮件。Sidekiq和rails 4 actionmailer从不提供电子邮件

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

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

我已经有尝试:

  • 我已经添加了GitHub的分支为sidekiq的rails4(我也尝试了主)
  • 我已经更新和检查的Redis版本要大于2.4 (这是2.6.14)
  • 我正在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: "[email protected]", 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/[email protected]/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做的,但我不知道如何调试,一切似乎工作,但邮件永远不会传递。

+1

日志文件是否包含有用的东西? –

+0

只有这个警告:me/ujohn/.rvm/gems/[email protected]/bundler/gems/sidekiq-4ed6eba8aff1/lib/sidekiq/rails.rb:14:警告:顶层常量队列由Sidekiq引用:: Client :: Queue,但sidekiq的队列似乎工作正常。使用actionmailer处理电子邮件似乎中断。 – JohnDel

+0

这听起来像一个错误,因为你似乎在做正确的事情。我会提出这个问题作为回购问题。 –

回答

15

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

RAILS_ENV=production bundle exec sidekiq -D 

在生产环境中运行。这与资产预编译相同。

+0

运行此命令后,出现了此错误'无效的选项:-D'。 'RAILS_ENV =生产捆绑包exec sidekiq -d'工作。 – webster

2

我的设置是一样的:

  • 轨道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' } 

当然,这些变化我清除根目录和完全重新加载应用程序的每一个之后,并重新启动我的服务器。

现在我看到调试行打印出伪造的配置值,并且邮件(...)函数仍在执行而没有任何错误。尽管如此,

config.action_mailer.raise_delivery_errors = true 
config.action_mailer.perform_deliveries = true 

被设置在配置(并被确认为由调试线设置)。我的邮件模板被渲染,整个事情都能正常工作,但sendmail命令永远不会被执行,甚至不会被尝试。

于是我看了看源代码在/ var/lib中/宝石的邮件和的ActionMailer

Action Mailer source

...我看到邮件(...)函数结束只是“m” - 所以它返回邮件对象。在邮件实际发送的邮件(...)功能中,我看不到任何地方。

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

于是,我就这样叫是返回的对象“交付”:

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

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

+1

由于您的电子邮件没有发件人地址,因此无法发送。 https://开头github上。COM/mperham/sidekiq /斑点/主/ LIB/sidekiq /扩展/ action_mailer.rb#L20 –

相关问题