そんなプラグインがあるそうです。
先日Rails本をKindleで読んでいたらそんな物があるよー、てなことが書いてありました。

以前は、rescue_action_in_public とかで独自に実装してたりしたのですが、今回は折角なのでプラグインを使うことにしよう。

https://github.com/rails/exception_notification
上記が最新版なのですが、私のRailsは2.3系なので、

http://github.com/rails/exception_notification/tree/2-3-stable
こっちからダウンロード。
なんか ./script/plugin install では上手くいかなかったので、
Downloadリンクからtar.gzファイルを落として直接
vendor/plugin/適当名前 に解凍しました。

READMEの基本的な使用方法を読んでみる。

== Usage

First, include the ExceptionNotifiable mixin in whichever controller you want
to generate error emails (typically ApplicationController):

  class ApplicationController < ActionController::Base
    include ExceptionNotification::Notifiable
    ...
  end

Then, specify the email recipients in your environment:

  ExceptionNotification::Notifier.exception_recipients = %w(joe@schmoe.com bill@schmoe.com)

And that's it! The defaults take care of the rest.


要はApplicationControllerの先頭で

    include ExceptionNotification::Notifiable

してやって、config/environment.rbでもconfig/initializers に適当なファイルを作ってそのなかで、

  ExceptionNotification::Notifier.exception_recipients = %w(送信先のメールアドレス)

ってしてあげればOKらしい。

あ、もちろんActionMailerが設定済みでメール送信できる環境にあることが前提ですが。
私の場合はGMailで送るのでActionMailerの設定はこんな感じになってます。


ActionMailer::Base.smtp_settings = {
  :enable_starttls_auto => true,
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => "hogehoge",
  :authentication => :plain,
  :user_name => "Gmailアカウント",
  :password => "Gmailパスワード"
}  

で、早速わざと例外を投げるアクションを作ってメールが飛ぶかどうか実験してみる。

HogeController < ApplicationController 
  def index
    raise 'わざとエラー'
  end
end
う〜ん、とばない、、、。というかメール送信処理が呼ばれた形跡すらない、、、。
あ、developmentモードで起動してるからかな? とおもい、
./script/server -e production
で本番モードで実行してみる。

Net::SMTPFatalError (555 5.5.2 Syntax error. t14sm2087499icd.10
):
  /home/satoyan/.rvm/rubies/ruby-1.8.7-p330/lib/ruby/1.8/net/smtp.rb:942:in `check_response'
  /home/satoyan/.rvm/rubies/ruby-1.8.7-p330/lib/ruby/1.8/net/smtp.rb:911:in `getok'
  /home/satoyan/.rvm/rubies/ruby-1.8.7-p330/lib/ruby/1.8/net/smtp.rb:826:in `mailfrom'
  /home/satoyan/.rvm/rubies/ruby-1.8.7-p330/lib/ruby/1.8/net/smtp.rb:653:in `sendmail'
  /home/satoyan/.rvm/rubies/ruby-1.8.7-p330/lib/ruby/1.8/net/smtp.rb:526:in `start'

なんかこんなエラーがでてしまう。

調べてみるとNet::SMTPのライブラリに変更があったようで送信者に
senderName<hogehoge@hoge>
みたいな書き方をするとこのエラーになるようです。

で、送信者ってどうやって設定するのか調べたらこれもREADMEに書いてありました。

  # defaults to exception.notifier@default.com
  ExceptionNotification::Notifier.sender_address =
    %("Application Error" <app.error@myapp.com>)

やはり、デフォルトでダメのようです。
なので
 ExceptionNotification::Notifier.sender_address = 'hogehoge@hoge'
と書き換えて再度実行。

ちゃんとメールが飛びました。

で、メールにはどんな情報があるかというと、

By default, the notification email includes four parts: request, session,
environment, and backtrace (in that order).

とあるように、
  1. リクエスト情報
  2. セッション
  3. 環境変数
  4. 例外のスタック
の4つが取れようです。

ただし、これは app/views/exception_notifier  下に独自にビューを置くことでカスタマイズ可能、とのことです。

また、404エラーの場合は、メール通知はされないようです。
たしかに404でいちいちメール送信されたくはないです。

また、当然ながら、独自に例外をハンドルしている場合もメール通知はされません。
手動でメールを送信する場合は、こんな感じで notify_about_exception を呼び出せばOKのようです。

  def index
    #risky operation here
  rescue StandardError => error
    #custom error handling here
    notify_about_exception(error)
  end


ただ、別件でやってるRailsの方は、システムからメールを飛ばすこと自体できないんで、そっちでは使えねー、、。ていうかメール飛ばすくらい許可しろよって感じなんですが、、、。