我在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
有人可以帮忙吗?感谢
答案 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插件并添加了所需的配置变量。