CakePHP 4 でメールを送信せずにログファイルに出力する方法

はじめに

Web 開発ではメール送信機能を実装することがよくあります。

CakePHP 4 にもメール関連の便利な機能が実装されていて、基本的なメール送信と HTML メールについては過去の「CakePHP 4 で テキストと HTML のメール送信を実装」でもご紹介しました。

ところでローカルで開発作業を行う際には、メール送信を行わずファイルに出力したい場合があります。 存在しないメアドを使いたいケースもありますよね。

今日は CakePHP 4メールを送信せずにファイル出力する方法をご紹介します。

今回使用したのは CakePHP 4.1.5 (cakephp/app 4.1.2) です。

目次
  1. 下準備
  2. 設定方法
  3. おわりに

1. 下準備

動作確認に使用したコントローラです。
メールを送信するだけの単純なコードです。

/src/Controller/SampleController.php
<?php
declare(strict_types=1);

namespace App\Controller;

use Cake\Mailer\Mailer;

class SampleController extends AppController
{
    public function index()
    {
        $mailer = new Mailer();
        $mailer->setFrom(['from@example.com' => 'Sample'])
            ->setTo('to@example.com')
            ->setSubject('サンプルメール')
            ->deliver('これはサンプルです');
        die('Finished');
    }
}

2. 設定方法

app_local.php に下記のように追記することで、メールを送らずにログファイルに出力することができます。

Mailer() で default 以外を指定している方は 'default' 部分をその名称に変更してください。

/config/app_local.php
<?php
// ↓ 追加 (下記 Log 箇所を app.php に書く場合は不要)
use Cake\Log\Engine\FileLog;
...
    'EmailTransport' => [
        'default' => [
            // ↓ これを追加
            'className' => 'debug',
            ...
        ],
    ],

    // ↓ 追加
    'Email' => [
        'default' => [
            'log' => 'debug',
        ]
    ],

    // ↓ 追加
    'Log' => [
        'email' => [
            'className' => FileLog::class,
            'path' => LOGS,
            'file' => 'email',
            'scopes' => ['email'],
        ],
    ]

これでも動作に問題はないのですが、可能でしたら Log の設定は app.php に書いた方が便利かもしれません。
(デフォルトでは、各種 Log の設定は app.php にあります)

/config/app.php
'Log' => [
    // ↓ 追加
    'email' => [
        'className' => FileLog::class,
        'path' => LOGS,
        'file' => 'email',
        'scopes' => ['email'],
    ],

scopesemail を指定しているところですが、これは公式ドキュメントでは記述がみつからず、解析して把握しました。

メールの内容は下記のように /logs/email.log に保存されます。
ファイル名を変更したい場合は Log にある file の値を書き換えてください。

/logs/email.log
2020-11-15 12:34:56 Debug:
From: Sample <from@example.com>
To: to@example.com
Date: Sun, 15 Nov 2020 12:34:56 +0000
Message-ID: <0123456789abcdef0123456789abcdef@example.com>
Subject: =?UTF-8?B?44K144Oz44OX44Or44Oh44O844Or?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

これはサンプルです

Subject が文字化けのようになっていますが、これは Base64 方式でエンコードされています。
下記のように base64_decode() を使うことで元の文字列に戻すことが可能です。

debug(base64_decode('44K144Oz44OX44Or44Oh44O844Or'));

3. おわりに

メールのログファイル出力は、誤送信の心配や確認作業の負担が軽減されるので、よく使用しています。

設定を app_local.php で行えるのは、Git などのバージョン管理ソフトを使用する際にとても便利ですよね。

ただ、ログファイルでのチェックのみだと、件名などで見落としが生じる場合があるので、最終確認は実際に送信して行うのがオススメです。