Какие исключения могут быть вызваны отправителем действий - PullRequest
9 голосов
/ 08 февраля 2012

Я посмотрел на класс, но не смог увидеть список возможных исключений, которые могут возникнуть при доставке электронной почты SMTP в rails 3.

Кто-нибудь есть идеи?

Ответы [ 4 ]

4 голосов
/ 07 марта 2013

Мы обнаружили, что этот список работает очень хорошо для стандартных ошибок, к которым вы можете повторить попытку:

[ EOFError,
IOError,
TimeoutError,
Errno::ECONNRESET,
Errno::ECONNABORTED,
Errno::EPIPE,
Errno::ETIMEDOUT,
Net::SMTPAuthenticationError,
Net::SMTPServerBusy,
Net::SMTPSyntaxError,
Net::SMTPUnknownError,
OpenSSL::SSL::SSLError
]

Обратите внимание, что я не включил Net::SMTPFatalError, потому что это часто постоянный сбой (как черный адрес электронной почты).

3 голосов
/ 21 мая 2012

Зависит от ваших настроек как отправлять почту.Если вы отправляете почту через smtp, ActionMailer использует Net::SMTP.Там вы найдете ошибки, которые могут возникнуть.

Если ваше приложение настроено на использование sendmail, ActionMailer использует IO.

2 голосов
/ 14 августа 2012

В этом посте по адресу mindbot суммированы все возможные исключения SMTP и представлен довольно элегантный способ работы со всеми из них.

http://robots.thoughtbot.com/post/159806037/i-accidentally-the-whole-smtp-exception

Вот возможные исключения:

SMTP_SERVER_ERRORS = [TimeoutError,
                      IOError,
                      Net::SMTPUnknownError,
                      Net::SMTPServerBusy,
                      Net::SMTPAuthenticationError]

SMTP_CLIENT_ERRORS = [Net::SMTPFatalError, Net::SMTPSyntaxError]
0 голосов
/ 22 апреля 2016

Возможно больше ошибок в зависимости от того, какой метод доставки вы используете. Если вы используете сервис Amazon SES через гем aws-ses, добавьте следующую ошибку в ваш массив

AWS::SES::ResponseError

Вы можете использовать такой код, чтобы поймать ошибки

# some_utility_class.rb
# Return false if no error, otherwise returns the error
  def try_delivering_email(options = {}, &block)
    begin
      yield
      return false
    rescue  EOFError,
            IOError,
            TimeoutError,
            Errno::ECONNRESET,
            Errno::ECONNABORTED,
            Errno::EPIPE,
            Errno::ETIMEDOUT,
            Net::SMTPAuthenticationError,
            Net::SMTPServerBusy,
            Net::SMTPSyntaxError,
            Net::SMTPUnknownError,
            AWS::SES::ResponseError,
            OpenSSL::SSL::SSLError => e
      log_exception(e, options)
      return e
    end
  end

# app/controller/your_controller.rb

if @foo.save
  send_email
  ...


private

  def send_email
    if error = Utility.try_delivering_email { MyMailer.my_action.deliver_now }
      flash('Could not send email : ' + error.message)
    end
  end
...