[Laravel] Mailクラスによるメール送信の結果をファイル出力させる

カテゴリ: Laravel | タグ:

LaravelではMailクラスによってメール送信処理を簡単に作ることができます。

ローカル開発やPHPUnitでは、実際にメールを送信させるのではなくファイルに出力させるなど、メールの送信メソッドがコールされた時の振る舞いを差し替えたい場合があります。

今回、メールの送信結果をログファイルに出力してみました。

.env

まず、.envのMAIL_DRIVERをlogに書き換えます。また、ログの出力設定をMAIL_LOG_CHANNELで指定します。今回はチャネルをmailという定義に設定しました。

MAIL_DRIVER=log
MAIL_LOG_CHANNEL=mail
#MAIL_LOG_CHANNEL=stack  // stackにしても良い(stackだとlog/laravel.logに出力される)

PHPUnitで動作させるときはphpunit.xmlに定義を記載します。デフォルトだと以下のようにarrayになっているのでlogに変更します。

        <server name="MAIL_DRIVER" value="array"/>

config/logging.php

config/logging.phpで、mailログチャネルの定義を追加します。今回は、storage/logs/mail-log.logファイルに出力させる定義を書きました。ログレベルは'debug'にする必要があります。

        'mail' => [
            'driver' => 'single',
            'path' => storage_path('logs/mail-log.log'),
            'level' => 'debug',
        ],

Controller

以下のような感じで、Controllerクラスを作成します

<?php
namespace App\Http\Controllers;

use App\Mails\MailSender;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class MailTestController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        $toUser = 'user@example.com';
        $mailable = new MailSender;

        // 送信される想定のメール本文をブラウザで確認したい場合
        // return ($mailable)->render();

        // メール送信する
        Mail::to($toUser)->send($mailable);
        return response()->json(['result' => 'OK']);
    }
}

動作テスト

その後routeを定義し、該当のControllerを実行させます。実行後にmail-log.logを見ると送られるはずだったメールの内容がファイルに出力されます。

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。