ActionMailerでエラーをハンドリングする


INDEX PAGE


ActionMailerでエラーをハンドリングする


LoginEngineのメール通知機能をいじる中でActionMilerを設定しました。
当初あまりちゃんと設定しなくても、メールが送信できて喜んでいたのですが
少し動かしていくうちに色々はまりました。

ActionMailerを動かすためには
メールサーバーなど色々設定しないといけないようです。
環境ごとにメールサーバーが異なるようなら
 condfig/environments/xxxx.rb
環境ファイルで、環境にかかわらず設定が一緒なら
 condfig/environment.rb
に下記のように設定すればよいです。

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.smtp_settings = {
 :address => 'smtp.hoge.co.jp',
 :port => 25,
 :domain => 'hoge.co.jp',
 :user_name => 'hogehoge',
 :password => 'fugafuga',
 :authentication => :login
}

特に気をつけたいのが

ActionMailer::Base.raise_delivery_errors = true

で、これを設定しないとエラーがスルーしていきます。
はじめこれを知らずに、エラーがスルーして
画面上では正常に処理が完了されるのに、メールが送信されずに悩みました。


さて、本題のエラーのハンドリングなのですが
エラーは様々なエラーが発生するのでエラーメッセージで判定するしかないようです。
今のところ以下の二つのみハンドリングしています。
 ・SMTPサーバーへの接続に失敗
   →(原因)システム障害
   →(エラーメッセージ)User unknown in virtual mailbox table
 ・宛先メールアドレスに送信できない
   →(原因)ユーザーの入力ミス
   →(エラーメッセージ)Name or service not known



他にもありそうですが、今のところは放置しています。

beigin
 (メールを送信する処理)
rescue => excptn
 if excptn.message.include?("User unknown in virtual mailbox table") then
  flash.now[:warning] = "メールアドレスにメールが送信できませんでした。メールアドレスを確認ください。"
 elsif excptn.message.include?("Name or service not known") then
  raise StandardError.new("SMTPに接続できません")
 else
  raise StandardError.new("その他エラーです")
 end
end

という感じで地道にハンドリングしています。
もう少しかっこよい方法があるといいなぁと思う今日この頃です。


INDEX PAGE