ActionMailerでエラーをハンドリングする
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
という感じで地道にハンドリングしています。
もう少しかっこよい方法があるといいなぁと思う今日この頃です。