2013-07-19 55 views
12

Tôi đã thiết lập sidekiq trong một ứng dụng đường ray 4 để gửi email và xử lý các công việc nền. Tôi cũng đã nghĩ ra rằng tôi đang sử dụng devise_async và một trình gửi email liên hệ điển hình. Tôi đang sử dụng gmail để gửi email.Sidekiq và ray 4 actionmailer không bao giờ gửi email

Nếu tôi loại bỏ sidekiq, nó sẽ gửi email thông thường qua gmail (cả hình thức liên lạc và liên hệ) nhưng khi tôi bật nó, nó không hoạt động (không phải là devise_async không liên hệ với mẫu). Sidekiq cho thấy rằng các công việc nền tảng bắt đầu và kết thúc thành công (tôi cũng thấy chúng thông qua ứng dụng sinatra mà nó đã được xử lý) nhưng email chưa bao giờ được gửi đi.

Trong quá trình phát triển, bảng điều khiển cho thấy các email được gửi (cả với devise_async và từ biểu mẫu liên hệ, vì chúng được xử lý với sidekiq thành công).

Những gì tôi đã có thử:

  • Tôi đã thêm các chi nhánh github cho rails4 của sidekiq (Tôi cũng đã thử các bậc thầy)
  • Tôi đã cập nhật và kiểm tra redis phiên bản lớn hơn 2.4 (đó là 2.6.14)
  • tôi đang chạy sidekiq với bundle exec sidekiq

nhưng không làm việc. Tôi đang sử dụng ruby ​​2.0.0-p247.

Tôi cũng đã thiết lập xử lý hình ảnh với sidekiq trong ứng dụng này và hoạt động hoàn hảo cả trong phát triển và trong sản xuất.

Tôi không làm bất cứ điều gì lạ mắt nhưng tôi thêm mã hoàn thành:

đang bưu phẩm của tôi:

def send_message 
    @message = Message.new(message_params) 
    if @message.save 
    ContactMailer.delay.contact_form(@message.id) 
    end 
end 

bưu phẩm của tôi:

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 

và cấu hình của tôi phục vụ sản xuất (mà nó hoạt động mà không có 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" } 

Và đây một hàng đợi sidekiq tiêu biểu:

/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 

tôi nghĩ rằng nó đã làm với ActionMailer và sidekiq nhưng tôi không biết làm thế nào để gỡ lỗi, mọi thứ dường như làm việc nhưng các email không bao giờ chuyển giao.

+1

Tệp nhật ký có chứa bất kỳ điều gì hữu ích không? –

+0

Chỉ cảnh báo này: me/ujohn/.rvm/gems/[email protected]/bundler/gems/sidekiq-4ed6eba8aff1/lib/sidekiq/rails.rb: 14: cảnh báo: Hàng đợi liên tục được tham chiếu bởi Sidekiq :: Khách hàng :: Hàng đợi nhưng hàng đợi của sidekiq dường như hoạt động tốt. Việc xử lý các email với các hành động có vẻ như bị hỏng. – JohnDel

+0

Điều này nghe có vẻ giống như một con bọ, dường như bạn đang làm những việc đúng đắn. Tôi sẽ nêu nó như một vấn đề trên repo. –

Trả lời

15

tôi tìm thấy nó, bạn phải chạy sidekiq như thế này:

RAILS_ENV=production bundle exec sidekiq -D 

để chạy trong sản xuất. Đó là vấn đề tương tự như các tài sản biên dịch trước.

+0

Tôi nhận được lỗi này 'tùy chọn không hợp lệ: -D' sau khi chạy lệnh này. 'RAILS_ENV = gói sản xuất exec sidekiq -d' hoạt động. – webster

2

thiết lập của tôi cũng giống như thế này:

  • Rails 4
  • của Ruby 1.9.3
  • ActionMailer
  • sidekiq
  • devise_async

Mã của tôi để chạy các bưu phẩm chỉ chạy tốt và lối thoát hiểm mà không cần bất kỳ lỗi nào - nhưng không được thực hiện và không có email được gửi đi. Từ bưu phẩm của tôi:

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!" 

Mã đó được gọi từ công việc sidekiq. Tôi có thể thấy trong các đường ray ghi lại các thông báo từ các dòng gỡ lỗi, xác nhận rằng dòng mã này được gọi. Tôi cũng thấy các giá trị của sendmail_settings, xác nhận rằng các thiết lập là những cái từ development.rb.

Vì vậy, chỉ dành riêng cho tiếng cười khúc khích, tôi đã thay đổi các thiết lập này trong development.rb:

config.action_mailer.sendmail_settings = { :location => '/bogus/doesnt/exist' } 

Dĩ nhiên sau mỗi lần một trong những thay đổi mà tôi tẩy webroot và hoàn toàn tải lại ứng dụng, và khởi động lại máy chủ của tôi .

Bây giờ tôi thấy dòng gỡ lỗi in ra giá trị cấu hình không có thật, và vẫn chức năng thư (...) đang thực thi mà không có bất kỳ lỗi nào. Điều này là mặc dù điều này

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

được đặt trong cấu hình (và được xác nhận là được đặt bởi dòng gỡ lỗi). Các mẫu thư của tôi được hiển thị và toàn bộ công việc hoạt động, nhưng lệnh sendmail không bao giờ được thực thi hoặc thậm chí là đã thử.

Vì vậy, sau đó tôi nhìn vào mã nguồn trong/var/lib/đá quý cho cả Mail và ActionMailer

Action Mailer source

... và tôi thấy rằng qua đường bưu điện (...) chức năng kết thúc với chỉ "m" - vì vậy nó trả về đối tượng Mail. Tôi không thể nhìn thấy bất cứ nơi nào trong thư (...) chức năng nơi thư thực sự được gửi.

Tôi đã thêm dòng nhật ký gỡ lỗi vào hàm send (...) trong đá quý ActionMailer và tôi thấy rằng trong nhật ký. Tôi đã thêm debug vào hàm phân phối smtp trong gem Mail và nó không bao giờ được gọi.

Vì vậy, tôi đã cố gắng kêu gọi "cung cấp" trên mà đối tượng quay trở lại như sau:

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

Bây giờ, công trình mail của tôi. Tôi không biết chuyện gì đang diễn ra ở đây. Nếu điều này là hữu ích cho bất cứ ai khác tôi hy vọng nó sẽ giúp. Tôi đã lãng phí một ngày của thời gian dev về điều này, vì vậy tôi sẽ chỉ mất nó như là "nó hoạt động" và kiểm tra xem nó.

+1

Email của bạn không phân phối vì nó không có địa chỉ Từ. https: // github.com/mperham/sidekiq/blob/master/lib/sidekiq/extensions/action_mailer.rb # L20 –

1

Thực ra tôi có cùng một vấn đề khi sử dụng phiên bản 4 ray. Các giải pháp trên không làm việc cho tôi. Vì vậy, tôi đã thử đá quý sidekiq mailer https://github.com/andersondias/sidekiq_mailer và làm cho nó hoạt động tốt!

Các vấn đề liên quan