2012-01-03 35 views
17

問題是如何捕獲由ActionMailer發送郵件中的異常。對我來說這聽起來不太可能,因爲在這種情況下,ActionMailer應該向郵件服務器發送郵件,如果郵件服務器返回錯誤,ActionMailer會向我顯示這個錯誤。我只對計算未送達的郵件感興趣。如何捕獲ActionMailer中的錯誤異常

你有什麼想法如何實現這個? 謝謝!

回答

23

我使用的控制器是這樣的:

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 "/" 
11

這應該適用於任何環境文件。 development.rbproduction.rb

config.action_mailer.raise_delivery_errors = true 
+0

我不想表現出異常的用戶,我只需要識別交貨失敗 – com 2012-01-03 12:22:01

+2

的用戶將看不到異常,只要你拯救和處理它!我還想向Airbrake或某種異常通知服務報告事情,以便我們知道事情是否失敗 - 即使它們正在愉快地處理。 – Ricky 2014-03-21 14:35:23

5

如果要發送大量的電子郵件,你也可以讓你的代碼更加乾燥,得到異常的通知您的電子郵件做這樣的事情:

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/

+0

它不需要成爲一個班級。只是一個模塊,你可以用'module_function'定義方法 – 2016-04-11 18:31:56