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

© Xzxzyzyz