web-dev-qa-db-ja.com

ActionMailerでエラー例外をキャッチする方法

問題は、ActionMailerによるメール配信の例外をどのようにキャッチできるかです。この場合、ActionMailerはメールをメールサーバーに送信する必要があり、メールサーバーがエラーを返した場合、ActionMailerはこのエラーを表示するはずなので、私には不可能に聞こえます。未配信のメールを数えることだけに興味があります。

これを実装する方法について何かアイデアはありますか?ありがとう!

20
com

私はコントローラーで次のようなものを使用しています:

 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 "/"
28
piffy

これは、どの環境ファイルでも機能するはずです。 development.rbまたはproduction.rb

config.action_mailer.raise_delivery_errors = true
12
Sukeerthi Adiga

大量のメールを送信している場合は、コードをさらにDRY)保持し、次のようにしてメールの例外の通知を受け取ることもできます。

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/

7
class ApplicationMailer < ActionMailer::Base
  rescue_from [ExceptionThatShouldBeRescued] do |exception|
    #handle it here
  end
end

Rails 5以降で動作します。これがベストプラクティスです。

0
Sukeerthi Adiga