问题是如何捕获由ActionMailer发送邮件中的异常。对我来说这听起来不太可能,因为在这种情况下,ActionMailer应该向邮件服务器发送邮件,如果邮件服务器返回错误,ActionMailer会向我显示这个错误。我只对计算未送达的邮件感兴趣。如何捕获ActionMailer中的错误异常
你有什么想法如何实现这个? 谢谢!
问题是如何捕获由ActionMailer发送邮件中的异常。对我来说这听起来不太可能,因为在这种情况下,ActionMailer应该向邮件服务器发送邮件,如果邮件服务器返回错误,ActionMailer会向我显示这个错误。我只对计算未送达的邮件感兴趣。如何捕获ActionMailer中的错误异常
你有什么想法如何实现这个? 谢谢!
我使用的控制器是这样的:
if @user.save
begin
UserMailer.welcome_email(@user).deliver
flash[:success] = "#{@user.name} created"
rescue Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError => e
flash[:success] = "Utente #{@user.name} creato. Problems sending mail"
end
redirect_to "/"
这应该适用于任何环境文件。 development.rb
或production.rb
config.action_mailer.raise_delivery_errors = true
如果要发送大量的电子邮件,你也可以让你的代码更加干燥,得到异常的通知您的电子邮件做这样的事情:
status = Utility.try_delivering_email do
ClientMailer.signup_confirmation(@client).deliver
end
unless status
flash.now[:error] = "Something went wrong when we tried sending you and email :("
end
工具类:
class Utility
# Logs and emails exception
# Optional args:
# request: request Used for the ExceptionNotifier
# info: "A descriptive messsage"
def self.log_exception(e, args = {})
extra_info = args[:info]
Rails.logger.error extra_info if extra_info
Rails.logger.error e.message
st = e.backtrace.join("\n")
Rails.logger.error st
extra_info ||= "<NO DETAILS>"
request = args[:request]
env = request ? request.env : {}
ExceptionNotifier::Notifier.exception_notification(env, e, :data => {:message => "Exception: #{extra_info}"}).deliver
end
def self.try_delivering_email(options = {}, &block)
begin
yield
return true
rescue EOFError,
IOError,
TimeoutError,
Errno::ECONNRESET,
Errno::ECONNABORTED,
Errno::EPIPE,
Errno::ETIMEDOUT,
Net::SMTPAuthenticationError,
Net::SMTPServerBusy,
Net::SMTPSyntaxError,
Net::SMTPUnknownError,
OpenSSL::SSL::SSLError => e
log_exception(e, options)
return false
end
end
end
得到了我最初的设计灵感来自这里:http://www.railsonmaui.com/blog/2013/05/08/strategies-for-rails-logging-and-error-handling/
它不需要成为一个班级。只是一个模块,你可以用'module_function'定义方法 – 2016-04-11 18:31:56
我不想表现出异常的用户,我只需要识别交货失败 – com 2012-01-03 12:22:01
的用户将看不到异常,只要你拯救和处理它!我还想向Airbrake或某种异常通知服务报告事情,以便我们知道事情是否失败 - 即使它们正在愉快地处理。 – Ricky 2014-03-21 14:35:23