CakePHP 4 でメールを送信せずにログファイルに出力する方法
はじめに
Web 開発ではメール送信機能を実装することがよくあります。
CakePHP 4 にもメール関連の便利な機能が実装されていて、基本的なメール送信と HTML メールについては過去の「CakePHP 4 で テキストと HTML のメール送信を実装」でもご紹介しました。
ところでローカルで開発作業を行う際には、メール送信を行わずファイルに出力したい場合があります。 存在しないメアドを使いたいケースもありますよね。
今日は CakePHP 4 でメールを送信せずにファイル出力する方法をご紹介します。
今回使用したのは CakePHP 4.1.5 (cakephp/app 4.1.2) です。
1. 下準備
動作確認に使用したコントローラです。
メールを送信するだけの単純なコードです。
<?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');
}
}
- Mailer - CakePHP 4.x Strawberry Cookbook
- https://book.cakephp.org/4/en/core-libraries/email.html
2. 設定方法
app_local.php に下記のように追記することで、メールを送らずにログファイルに出力することができます。
Mailer() で default 以外を指定している方は 'default' 部分をその名称に変更してください。
<?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 にあります)
'Log' => [
// ↓ 追加
'email' => [
'className' => FileLog::class,
'path' => LOGS,
'file' => 'email',
'scopes' => ['email'],
],
scopes に email を指定しているところですが、これは公式ドキュメントでは記述がみつからず、解析して把握しました。
- Configuration Profiles (Mailer - CakePHP 4.x Strawberry Cookbook)
- https://book.cakephp.org/4/en/core-libraries/email.html#configuration-profiles
- Configuring Transports (Mailer - CakePHP 4.x Strawberry Cookbook)
- https://book.cakephp.org/4/en/core-libraries/email.html#configuring-transports
- Logging Scopes (Logging - CakePHP 4.x Strawberry Cookbook)
- https://book.cakephp.org/4/en/core-libraries/logging.html#logging-scopes
メールの内容は下記のように /logs/email.log に保存されます。
ファイル名を変更したい場合は Log にある file の値を書き換えてください。
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'));
- PHP: base64_decode - Manual
- https://www.php.net/manual/ja/function.base64-decode.php
3. おわりに
メールのログファイル出力は、誤送信の心配や確認作業の負担が軽減されるので、よく使用しています。
設定を app_local.php で行えるのは、Git などのバージョン管理ソフトを使用する際にとても便利ですよね。
ただ、ログファイルでのチェックのみだと、件名などで見落としが生じる場合があるので、最終確認は実際に送信して行うのがオススメです。