Как отловить исключение ошибки в ActionMailer - PullRequest
17 голосов
/ 03 января 2012

Проблема в том, как я могу поймать исключение при доставке почты с помощью ActionMailer.Для меня это кажется невозможным, потому что в этом случае ActionMailer должен отправить почту на mailserver, и если mailserver возвращает ошибку, ActionMailer должен показать мне эту ошибку.Меня интересует только подсчет недоставленных писем.

У вас есть идеи, как это реализовать?Спасибо!

Ответы [ 4 ]

27 голосов
/ 17 июня 2012

Я использую что-то вроде этого в контроллере:

 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 голосов
/ 03 января 2012

Это должно работать в любом из ваших файлов среды. development.rb или production.rb

config.action_mailer.raise_delivery_errors = true
6 голосов
/ 13 января 2014

Если вы отправляете много электронных писем, вы также можете сделать свой код более СУХИМЫМ и получать уведомления об исключениях для своей электронной почты, выполнив что-то вроде этого:

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 голосов
/ 26 февраля 2019
class ApplicationMailer < ActionMailer::Base
  rescue_from [ExceptionThatShouldBeRescued] do |exception|
    #handle it here
  end
end

Работает с рельсами 5 лет. И это лучшая практика.

...