exception_notificationを使う手順

エラーが発生するとメールが飛んでくるgem、exception_notificationをやってみた。

環境

  • Mountain Lion
  • Rails 3.2.12
  • ruby 1.9.3p374
  • exception_notification (3.0.1)
  • mailcatcher (0.5.10)

やることの目次

  • SMTPサーバの用意
  • exception_notificationのインスコ
  • 設定ファイルを修正
  • (エラー発生させる用)コントローラーを作成
  • エラーを発生させてメールの確認

やることはざっとこんな感じ。

Railsをnewする

$ rails new notifi--- -T

アプリ名は適当。オプションTを付けるとUnitTestディレクトリを作成しない。
どうせRSpec入れるしこの段階から作らないほうがよい。

SMTPサーバの用意

メールサーバにGmailを使ってもよいけど今回はMailCatcherという仮想STMPサーバをたてるgemを使う。
使い方はすごく簡単。テスト用にはもってこい。

Gemfileにmailcatcherを追加。
# Gemfile
gem 'mailcatcher'
$ bundle install
mailcatcherのSMPTサーバを起動

起動はワンコマンドでおk。

 $ mailcatcher
Starting MailCatcher
==> smtp://127.0.0.1:1025
==> http://127.0.0.1:1080
*** MailCatcher runs as a daemon by default. Go to the web interface to quit.
ブラウザで確認する

以下にアクセス。

http://127.0.0.1:1080

以下のような画面が出てくるはず。すごく小綺麗感じ。

サーバの用意は終了。この後サーバの設定を追加する。

exception_notificationをインストール

まずexception_notificationをGemfileに追加する。

# Gemfile
gem 'exception_notification'

保存後

$ bundle

設定ファイルを修正する

修正する内容は

  • メール送るようにする
  • SMTPサーバの設定する
  • エラーメールの情報を設定する
メールを送るようにする

development環境では、デフォルトでメールを送らない設定になっているので以下のように修正する。

#app_root/config/environments/development.rb 
- config.action_mailer.raise_delivery_errors = false
+ config.action_mailer.raise_delivery_errors = ture
SMTPサーバ設定

SMTPサーバの設定の書き方は、本家にRails用の書き方があったのでそれに従う。
https://github.com/sj26/mailcatcher
application.rbに下記のコードを追加。

# app_root/config/application.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = { :address => "localhost", :port => 1025 }
exception_notificationの設定をする

config/environments/development.rbにエラー時に送信されるメールの情報を書く
情報は、メールのタイトルに付加する文字列、送信者名、送信相手のメールアドレスが必要。
以下のコードは本家に書いてあったのでそのまま拝借。

#app_root/config/environments/development.rb
config.middleware.use ExceptionNotifier,
  :email_prefix => "[Whatever] ",
  :sender_address => %{"notifier" <notifier@example.com>},
  :exception_recipients => %w{exceptions@example.com}

(エラー発生させる用)コントローラーを作成

なんでもよいので適当に作成する。

 $ rails g controller home index
      create  app/controllers/home_controller.rb
       route  get "home/index"
      invoke  erb
      create    app/views/home
      create    app/views/home/index.html.erb
      invoke  helper
      create    app/helpers/home_helper.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/home.js.coffee
      invoke    scss
      create      app/assets/stylesheets/home.css.scss

このままだと正常終了してしまうので、HomeController#indexに例外を発生させるコードを加えなければならない。
以下を追加する。

raise 'aaa'

以下のようになる。

class HomeController < ApplicationController
  def index
+    raise 'aaa'
  end 
end

エラーを発生させてメールの確認

さっき作ったHomeController#indexを踏んでみる。
http://localhost:3000/home/index

すると例外が発生し、以下のようになる。

本題であるエラーメールが飛んでいるかを確認する。
http://127.0.0.1:1080/

来てる!!!
メールの内容に関しては後で見る。

以下のエラーについては通知対象から外れている。