2013-07-19 63 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 –

相關問題