Sidekiq и rails 4 actionmailer никогда не доставляет электронные письма

Я настроил sidekiq в приложении rails 4 для отправки электронных писем и обработки фоновых заданий. У меня также есть devise, который я использую devise_async и типичную контактную форму emailer. Я использую gmail для отправки писем.

если я удаляю sidekiq, он отправляет электронные письма обычно через gmail (как разработать, так и контактную форму), но когда я включаю его, он не работает (ни devise_async ни контактная форма). Sidekiq показывает, что фоновые задания начинаются и заканчиваются успешно (я также вижу их через приложение sinatra, которое было обработано), но электронное письмо никогда не было доставлено.

в разработке консоль показывает, что отправленные письма (как с devise_async, так и из контактной формы, поскольку они успешно обрабатываются с sidekiq).

что у меня уже есть попробовать:

  • я добавил ветку github для rails4 sidekiq (я также пробовал мастер)
  • я обновил и проверил версия 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: "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 ответов


Я нашел его, вы должны запустить sidekiq такой:

RAILS_ENV=production bundle exec sidekiq -D

запустить в производство. Это та же проблема, что и предварительная компиляция активов.


моя настройка такая же, как эта:

  • рельсы 4
  • Руби 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, подтверждая, что настройки являются теми, которые из разработки.рубидий.

Итак, просто для хихиканья, я изменил настройки на это в разработке.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 никогда не выполняется или даже не пробуется.

Итак, я посмотрел на исходный код в /var/lib / gems для почты и ActionMailer

Action Mailer source

...и я вижу, что Почта(...) функция заканчивается просто " m " - так что возвращает объект Mail. Я не мог видеть нигде в Почте(...) функция, где почта фактически отправляется.

Я добавил строки журнала отладки в send(...) функция в драгоценном камне ActionMailer, и я вижу это в журналах. Я добавил debug к функции доставки smtp в Mail gem, и ее никогда не вызывали.

поэтому я попытался вызвать "deliver" на этот возвращаемый объект таким образом:

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

теперь, моя почта работает. Я понятия не имею, что здесь происходит. Если это полезно кто-нибудь еще, я надеюсь, это поможет. Я потратил на это день времени dev, поэтому я просто возьму его как "он работает" и проверю его.


на самом деле у меня такая же проблема при использовании версии rails 4. Решение выше не работает для меня. Итак, я попробовал sidekiq mailer gem https://github.com/andersondias/sidekiq_mailer и получите его работу хорошо!


для тех, кто может извлечь выгоду из этого, я запустил sidekiq следующим образом:

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

на Procfile с помощью heroku