9

クラスを確認しましたが、Rails 3 で smtp メールを配信する際に発生する可能性のある例外のリストを確認できませんでした。

誰にもアイデアはありますか?

4

4 に答える 4

4

このリストは、再試行する可能性がある標準エラーに対して非常にうまく機能することがわかりました。

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

Net::SMTPFatalError多くの場合、恒久的な障害 (ブラックリストに登録された電子メール アドレスなど) であるため、含めていないことに注意してください。

于 2013-03-07T18:47:55.870 に答える
3

メールの送信方法は設定によって異なります。経由でメールを送信している場合smtp、ActionMailer は を使用しますNet::SMTP。そこで、発生する可能性のあるエラーを見つけることができます。

アプリケーションが を使用するように構成されている場合sendmail、ActionMailer は を使用しますIO

于 2012-05-21T10:39:00.350 に答える
2

thinkbot に関するこの投稿では、考えられるすべての 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]
于 2012-08-14T00:20:47.507 に答える
0

使用する配送方法によっては、さらにエラーが発生する可能性があります。aws-ses gem を介して Amazon 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
于 2016-04-22T17:37:25.927 に答える