ActionMailer + DelayedJob + Resque + SendGrid =并非所有发送的电子邮件

时间:2016-05-04 00:38:39

标签: ruby-on-rails ruby-on-rails-4 actionmailer delayed-job sendgrid

我使用ActionMailer,SendGrid和DelayedJob / Resque在Heroku上获得了一个Rails 4.2.5应用程序,用于后台处理。我有一个奇怪的问题,我无法在localhost上重现。

我发了一批电子邮件。不会出现任何错误,因此电子邮件似乎已成功发送出去。然后,我检查SendGrid的活动标签,看看那里只有一半的电子邮件。

我还没有使用SendGrid或ActionMailer做很多事情,所以我不确定如何调试问题或在本地重现它。我已经尝试通过在我的应用中创建100 contacts然后向他们发送相同的通知消息(就像应用程序在生产中会发生的那样)进行复制,但它们都成功完成。

development.rbproduction.rb我有:

config.action_mailer.raise_delivery_errors = true

production.rb我有:

config.action_mailer.default_url_options = { :host => 'http://firmplay.com' }
# config.action_mailer.delivery_method = :sendmail
# config.action_mailer.sendmail_settings = {
#   :location => '/usr/sbin/sendmail',
#   :arguments => '-i -t'
# }

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

我不确定评论的代码是否应该取消注释。

environment.rb我有:

ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => '587',
  :authentication => :plain,
  :user_name      => ENV['SENDGRID_USERNAME'],
  :password       => ENV['SENDGRID_PASSWORD'],
  :domain         => 'heroku.com',
  :enable_starttls_auto => true
}

application.rb我有:

config.active_job.queue_adapter = :resque

我不确定我在这里做错了什么,甚至在问题出现时,我怀疑它与我最近从Rails 4.0升级到4.2.5有关。我想知道电子​​邮件是否在DelayedJob / Resque的某个地方失败了,所以我检查了Resque日志,没有发现任何异常。

使用部分解决方案进行更新

我设法在解决这个问题方面取得了一些进展。当我在测试生产时,我意识到当使用我的web dyno将电子邮件排队为后台作业时,它会在10秒后超时,这是应用程序的限制。即使在网络工作者超时后,它仍继续排队电子邮件,直到内存不足(在日志中看到一些R14错误)。

在排队电子邮件时,我无法确定内存耗尽的原因。我并没有将电子邮件存储在内存中作为变量,但我认为当我遍历我的联系人列表时,它们可能会被无意中存储起来。

我最终做的是创建一个后台作业,我可以将联系人列表传递给。然后后台作业直接发送电子邮件。当我测试这种方法时,一切都很好,并且扩展得非常好。所以从本质上讲,我的问题已经解决了,尽管我仍然想知道为什么网络dyno在排队电子邮件时内存不足,而运行Resque的后台工作人员却没有遇到任何此类问题。

我最初使用.map遍历我的联系人,它将每个循环内返回的最后一项存储在内存中。我改为.each,认为这样可以解决问题,但事实并非如此。无论如何,问题似乎是Ruby将电子邮件存储在内存中以供控制器使用。

1 个答案:

答案 0 :(得分:1)

您的问题来源似乎是在this Heroku article处理。