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を見ると送られるはずだったメールの内容がファイルに出力されます。
こちらもおススメ