
[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-logLaravelの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);
=> nullemail_logテーブルに送信ログが保存されていることを確認しましょう。