【问题标题】:Sidekiq and rails 4 actionmailer never delivers emailsSidekiq 和 rails 4 actionmailer 从不发送电子邮件
【发布时间】:2018-03-14 10:02:12
【问题描述】:

我在 rails 4 应用程序中设置了 sidekiq,用于发送电子邮件和处理后台作业。我还设计了我正在使用的 devise_async 和一个典型的联系表格电子邮件。我正在使用 gmail 发送电子邮件。

如果我删除 sidekiq,它会通过 gmail(设计和联系表格)正常发送电子邮件,但是当我启用它时,它不起作用(devise_async 和联系表格都没有)。 Sidekiq 显示后台作业成功启动和完成(我还通过 sinatra 应用程序看到它们已被处理)但电子邮件从未送达。

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

我已经尝试过的:

  • 我已经为sidekiq的rails4添加了github分支(我也试过master)
  • 我已更新并检查 redis 版本是否大于 2.4(现在是 2.6.14)
  • 我正在使用 bundle exec sidekiq 运行 sidekiq

但没有任何效果。我正在使用红宝石 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 有关,但我不知道如何调试,一切似乎都正常,但电子邮件从未送达。

【问题讨论】:

  • 日志文件是否包含有用的信息?
  • 只有这个警告:me/ujohn/.rvm/gems/ruby-2.0.0-p247@cluey/bundler/gems/sidekiq-4ed6eba8aff1/lib/sidekiq/rails.rb:14:警告:Sidekiq::Client::Queue 引用的顶级常量队列,但 sidekiq 的队列似乎工作正常。使用 actionmailer 处理电子邮件似乎中断了。
  • 这听起来像是一个错误,因为您似乎在做正确的事情。我会在回购中将其作为一个问题提出。

标签: ruby-on-rails ruby actionmailer sidekiq


【解决方案1】:

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

RAILS_ENV=production bundle exec sidekiq -D

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

【讨论】:

  • 运行此命令后出现此错误invalid option: -DRAILS_ENV=production bundle exec sidekiq -d 工作。
【解决方案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' }

当然,在每一项更改之后,我都会清除 webroot 并完全重新加载应用程序,然后重新启动我的服务器。

现在我看到调试行打印出虚假的配置值,但 mail(...) 函数仍在执行,没有任何错误。尽管如此

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

在配置中设置(并确认为由调试行设置)。我的邮件模板被渲染了,整个事情都正常了,但是 sendmail 命令从来没有被执行过,甚至没有被尝试过。

然后我查看了 /var/lib/gems 中 Mail 和 ActionMailer 的源代码

Action Mailer source

...我看到 mail(...) 函数仅以“m”结尾 - 所以它返回 Mail 对象。我在 mail(...) 函数中看不到实际发送邮件的任何地方。

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

所以我尝试在返回的对象上调用“deliver”:

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

现在,我的邮件可以使用了。我不知道这里发生了什么。如果这对其他人有用,我希望它有所帮助。我在这方面浪费了一天的开发时间,所以我将把它当作“它有效”并检查它。

【讨论】:

【解决方案3】:

实际上我在使用 rails 4 版本时也遇到了同样的问题。上面的解决方案对我不起作用。所以,我尝试了 sidekiq mailer gem https://github.com/andersondias/sidekiq_mailer 并让它运行良好!

【讨论】:

    【解决方案4】:

    对于任何可能从中受益的人,我这样运行 sidekiq:

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

    在 Procfile 上使用 heroku

    【讨论】:

      猜你喜欢
      • 2014-12-31
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2013-11-13
      • 2015-11-14
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多