クラスを確認しましたが、Rails 3 で smtp メールを配信する際に発生する可能性のある例外のリストを確認できませんでした。
誰にもアイデアはありますか?
クラスを確認しましたが、Rails 3 で smtp メールを配信する際に発生する可能性のある例外のリストを確認できませんでした。
誰にもアイデアはありますか?
このリストは、再試行する可能性がある標準エラーに対して非常にうまく機能することがわかりました。
[ EOFError,
IOError,
TimeoutError,
Errno::ECONNRESET,
Errno::ECONNABORTED,
Errno::EPIPE,
Errno::ETIMEDOUT,
Net::SMTPAuthenticationError,
Net::SMTPServerBusy,
Net::SMTPSyntaxError,
Net::SMTPUnknownError,
OpenSSL::SSL::SSLError
]
Net::SMTPFatalError
多くの場合、恒久的な障害 (ブラックリストに登録された電子メール アドレスなど) であるため、含めていないことに注意してください。
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]
使用する配送方法によっては、さらにエラーが発生する可能性があります。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