为什么我的电子邮件没有在我的Ruby on Rails 5应用程序中发送?

时间:2016-07-29 20:05:43

标签: ruby-on-rails email heroku ruby-on-rails-5

我在Heroku上有一个可以发送电子邮件的rails应用程序。我添加了一项新功能来发送通知电子邮件。 我在Heroku日志中得到了这个,但没有发送电子邮件。

2016-07-29T19:57:58.895499+00:00 app[web.1]: [ActiveJob] [NotificationBroadcastJob] [40c7b651-3c5d-4308-b8b5-49a142d2930f]   Rendered notifications_mailer/new_message.html.erb (226.4ms)
2016-07-29T19:57:58.895630+00:00 app[web.1]: [ActiveJob] [NotificationBroadcastJob] [40c7b651-3c5d-4308-b8b5-49a142d2930f] NotificationsMailer#new_message: processed outbound mail in 246.0ms
2016-07-29T19:57:58.895741+00:00 app[web.1]: [ActiveJob] [NotificationBroadcastJob] [40c7b651-3c5d-4308-b8b5-49a142d2930f] Performed NotificationBroadcastJob from Async(default) in 377.85ms

这是notifications_mailer ruby​​文件app / mailers / notifications_mailer.rb

class NotificationsMailer < ApplicationMailer
  def new_message(message)
    @message = message
    mail(to: message.receiver.email, subject: 'You have a new message')
  end  
end

这是我在app / jobs / notifications_broadcast_job.rb中调用new_message操作的方法

class NotificationBroadcastJob < ApplicationJob
.
.
    NotificationsMailer.new_message(personal_message).deliver_now

我使用的是Sendgrid插件,这是来自production.rb

  config.action_mailer.perform_caching = false

  # Ignore bad email addresses and do not raise email delivery errors.
  # Set this to true and configure the email server for immediate delivery to raise delivery errors.
  # config.action_mailer.raise_delivery_errors = false
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = 'www.abcdef.com'
  config.action_mailer.default_url_options = { host: host }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'www.abcdef.com',
    :enable_starttls_auto => true
  }

这是我的development.rb

  # Don't care if the mailer can't send.
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :test
  host = 'rails-tutorial-suai.c9.io'
  config.action_mailer.default_url_options = { host: host }
  config.action_mailer.perform_caching = false

我没有工人dynos。这是我的Procfile。

web: bundle exec puma -C config/puma.rb

有人可以帮忙吗?感谢

1 个答案:

答案 0 :(得分:1)

NotificationsMailer的来电网站位于class NotificationBroadcastJob < ApplicationJob。这意味着您正在使用ActiveJob。来自Mailer docs

  

Active Job的默认行为是通过:async执行作业   适配器。因此,您现在可以使用deliver_later发送电子邮件   异步。 Active Job的默认适配器运行带有的作业   进程内线程池。它非常适合开发/测试   环境,因为它不需要任何外部基础设施,   但是由于它正在减少待完成的工作,因此它不适合生产   重新开始。如果您需要持久的后端,则需要使用   具有持久后端的活动作业适配器(Sidekiq,Resque,   等)。

因此,在开发过程中,它可以在没有像Sidekiq / Resque这样的Job后端的情况下工作。假设你在Heroku上设置了类似的东西,你需要至少有一个工作器dyno旋转并在你的Procfile中注册一个工作进程。

以下是docs on Heroku,但要点是:您将需要Redis,一个像Sidekiq这样的队列后端,一个在您的Procfile中注册的工作进程(例如worker: bundle exec sidekiq -q default ),以及在Heroku上运行的工作流程(例如$ heroku ps:scale web=1 worker=1)。

这也假设您已在Heroku应用程序上配置了sendgrid插件并添加了所需的配置变量。

A similar SO answer