[Laravel] メールの送信ログをデータベースに保存する方法
Laravelのメールシステムを利用する際に、送信履歴をデータベースへログとして保存しておく方法を紹介します。
メールの送信処理に関わるクラスといえばMailable
クラスやNotification
クラスですが、共通して送信処理が行われた際に発火されるIlluminate\Mail\Events\MessageSending
イベントをフックすることで送信済みのメールオブジェクトのハンドリングが可能です。
今回は公開されているパッケージを使ってみます。
shvetsgroup/laravel-email-database-logパッケージ
Composerを使ってshvetsgroup/laravel-email-database-logをインストールします。
composer require shvetsgroup/laravel-email-database-log
Laravelの5.5
以上を使っている場合はPackage Auto Discoveryでサービスプロバイダが読み込まれます。
それ以外の場合は下記をconfig/app.php
へ追加しましょう。
'providers' => [
// ...
ShvetsGroup\LaravelEmailDatabaseLog\LaravelEmailDatabaseLogServiceProvider::class,
],
migrationを実行すると、パッケージに同封されているemail_log
テーブルが作成されます。
php artisan migrate
メールを送信する通知クラスも作成しておきましょう。
php artisan make:notification TestNotification
作成したTestNotification
クラスを利用してメールを送信してみます。
今回はTinker
を使用してコマンドラインからユーザーを作成し、メールの送信を行います。
php artisan tinker
>>> $user = factory(App\User::class)->make();
=> App\User {#867
name: "Oral Huel",
email: "[email protected]",
}
>>> $user->notify(new \App\Notifications\TestNotification);
=> null
email_log
テーブルに送信ログが保存されていることを確認しましょう。