動かざることバグの如し

近づきたいよ 君の理想に

ActionMailerのメール送信ログを出力する

久々のRailsネタ

今回やりたいのはActionMailer経由でのメール送信時に送信先のログを吐きたい。

ActionMailerにはObserverというトリガー?的な機能があるのでそれにhookする感じで

まずはログ出力先の設定 config/application.rbに追記

config.mail_logger = Logger.new("log/mail_#{Rails.env}.log")

次にObserverクラスを適当に作る 最終的にはmailクラスを引数に取るdelivered_emailが走るのでここでログを吐く

# config/initializers/email_log_observer.rb
class EmailLogObserver

  def delivered_email(email)
    msg = "from: #{email.from.join(',')} to: #{email.to.join(',')} subject: #{email.subject}"
    Rails.application.config.mail_logger.debug(msg)
  end
end

で、最後にapp/mailers/application_mailer.rbのApplicationMailer宣言後に一行追記

class ApplicationMailer < ActionMailer::Base
(略)
end

ActionMailer::Base.register_observer(EmailLogObserver.new)

これでメール送信時にlog/mail_development.logにログが流れるはず

参考リンク