如何在ActionMailer中捕获错误exception

问题是如何通过ActionMailer捕获邮件中的exception。 对我来说听起来不可能,因为在这种情况下,ActionMailer应该发送邮件到mailserver,如果mailserver返回错误,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.rbproduction.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 ||= "" 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/