Laravel でメール送信イベントを検知してログ出力
はじめに
Laravel でメール送信イベントを検知してログ出力する方法
TL;DR
MessageSent
イベントを監視app/Providers/EventServiceProvider.php
のprotected $listen
に設定
- リスナ(イベントハンドラ)内でログを出力
getTo
,getSubject
で送信先、件名を取得可能
- 要件/環境 によってはボトルネックになりかねないので注意が必要
目次
環境・条件
1 | $ cat /etc/os-release |
詳細
メール送信ということを最低限ログに残しておきたい場合の設定方法。
シンプルな方法
一番シンプルなのは、以下のようにメール送信箇所でログを出力すること。
1 | $email = new XxxxEmail(); |
メリットは「必要な箇所(例えば請求通知などの重要なもの)のみにログを制限できること」、デメリットは「必要な箇所すべてに処理を実装しないといけないこと」。
(とは言え、明示的に出力箇所を絞る、というのはセキュリティ的に見るとメリットになり得るとも思う)
イベント検知してロギング
参考:
- イベント 5.7 Laravel
- メール 5.7 Laravel
※試した環境のバージョンが古いので、各自のバージョンに合わせて適宜ドキュメント参照先を要変更
Laravel には指定したイベントに対してリスナ(イベントハンドラ)を設定し、特定の処理をさせるということが可能。そして、メール送信処理時に発火する標準のイベントも存在する。
ということで、「メール送信時に逐一ログを出力させる」ということが簡潔に記述できる。
app/Providers/EventServiceProvider.php
MessageSent
イベントを検知して、MailLogger
クラスで処理
1 | <?php |
app/Listeners/MailLogger.php
新規ファイル(php artisan make:listener
で作成)。
1 |
|
$event->data['message']->getTo()
で送信先アドレス一覧、同じように getSubject()
で件名が取得可能。
getTo()
は以下のような Array
になっているのでキーのみを取得。
1 | ['foo@example.com' => null, 'bar@example.com' => null, ...] |
注意事項
オーバーヘッドの考慮
同時利用者数が多い、メール送信頻度が高いなどの場合、ログ出力による影響(CPU, Disk, etc)もバカにならないはずなので、利用時には注意すること。
キュー利用時
キューを使っての送信の場合、ログ出力が反映されないことがある。
その際は、環境をリセット(再起動)すると反映されるはず。(自分は Laradock 環境で発生した)
まとめ
MessageSent
イベントを監視app/Providers/EventServiceProvider.php
のprotected $listen
に設定
- リスナ(イベントハンドラ)内でログを出力
getTo
,getSubject
で送信先、件名を取得可能
- 要件/環境 によってはボトルネックになりかねないので注意が必要
参考文献
関連記事
- Laravel で現在の URL 取得方法まとめ
- Laravel で Cookie を使う(参照/設定/削除)
- Laravel で PDF ファイルをブラウザで開く
- Laravel で withCount と having を使って絞り込み
- Laravel で「開始日時 < 終了日時」であることをバリデーションする
- Laravel で生 SQL を実行
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア