【发布时间】:2016-07-08 12:29:33
【问题描述】:
我在我的邮件中使用after_action 回调来记录该电子邮件已发送。电子邮件通过延迟作业发送。这有效,除非我们无法访问远程服务器 - 在这种情况下,电子邮件不会发送,但我们会记录它。延迟作业稍后重试电子邮件,并成功发送,但我们记录了已发送两封电子邮件。
看起来像这样:
class UserMailer < ActionMailer::Base
after_action :record_email
def record_email
Rails.logger.info("XYZZY: Recording Email")
@user.emails.create!
end
def spam!(user)
@user = user
Rails.logger.info("XYZZY: Sending spam!")
m = mail(to: user.email, subject: 'SPAM!')
Rails.logger.info("XYZZY: mail method finished")
m
end
end
我这样称呼这段代码(使用delayed job performable mailer):
UserMailer.delay.spam!( User.find(1))
当我在调试器中逐步执行此操作时,似乎我的 after_action 方法在邮件传递之前被调用。
[Job:104580969] XYZZY: Sending spam!
[Job:104580969] XYZZY: mail method finished
[Job:104580969] XYZZY: Recording Email
Job UserMailer.app_registration_welcome (id=104580969) FAILED (3 prior attempts) with Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 1025
如何在我的邮件方法中捕获网络错误并记录电子邮件尝试失败或什么都不做?我正在使用 Rails 4.2.4。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 actionmailer delayed-job