CakePHP 4 で テキストと HTML のメール送信を実装

はじめに

今日は CakePHP 4 でのメール送信の実装方法をご紹介します。テンプレートを使って、テキストのみのメールと、テキストと HTML を併せて送る方法の2種類のサンプルをご紹介します。

目次
  1. メール送信の設定
  2. テキストメール送信
  3. テキスト & HTML
  4. おわりに

1. メール送信の設定

メール送信の設定は config/app_local.php の下記で行います。

config/app_local.php
'EmailTransport' => [
  'default' => [
    'host' => 'localhost',
    'port' => 25,
    'username' => null,
    'password' => null,
    'client' => null,
    'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
  ],
],

下記 Cookbook の説明も参考に設定してください。下記では「gmail」という名前で作っていますが、今回のサンプルは default の設定で動かすコードになっています。

XAMPP の場合は設定しなくても大丈夫だと思います。ただし php.ini の sendmail_path に mailtodisk.exe などを指定する必要があります。
設定方法や使い方はここでは割愛しますので、「xampp mailtodisk」などで検索してみてください。

2. テキストメール送信

テキストメール送信は下記のように実装できます。

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

namespace App\Controller;

use Cake\Mailer\Mailer; // ← 追加

class MailsController extends AppController
{
  public function index()
  {
    if ($this->request->is('post')) {
      $mailer = new Mailer('default');
      $mailer->setFrom(['me@example.com' => 'My site'])
        ->setTo('you@example.com')
        ->setSubject('テストメール')
        ->viewBuilder()
          ->setTemplate('sample')
          ->setVar('message', 'こんにちは、世界!');
      $mailer->deliver();
    }
  }
}
/templates/email/text/sample.php
これはサンプルメールです。

メッセージ: <?= $message ?>
/templates/Mails/index.php
<form method="post">
  <div>
    <button type="submit">メール送信</button>
    <input
      type="hidden" name="_csrfToken" autocomplete="off"
      value="<?= $this->request->getAttribute('csrfToken') ?>">
  </div>
</form>

viewBuilder() を使って、テンプレートの各種設定を行っています。変数を渡す関数が setVar() になっていることに注意してください。

レイアウトに関する記述がありませんが /templates/layout/email/text/default.php 読みこまれています。別のレイアウトに変更する場合は下記のように指定します。

/templates/layout/email/text/for_member.php
チームメンバー 各位

<?= $this->fetch('content') ?>
/src/Controller/MailsController.php
->viewBuilder()
  ->setLayout('for_member') // ← 追加
  ->setTemplate('sample')

テンプレートを使用せずに、メール本文をテキストで指定する方法は、Cookbook の下記ページのサンプルを参考にしてください。

3. テキスト & HTML メール

HTML メールを送る場合には下記のように実装します。コントローラについては、先のコードにsetEmailFormat('both')を追加しているだけです。

/templates/email/html/sample.php
<h1>これはサンプルメールです。</h1>

<p>メッセージ: <?= $message ?></p>
/src/Controller/MailsController.php
<?php
declare(strict_types=1);

namespace App\Controller;

use Cake\Mailer\Mailer;

class MailsController extends AppController
{
  public function index()
  {
    if ($this->request->is('post')) {
      $mailer = new Mailer('default');
      $mailer->setFrom(['me@example.com' => 'My site'])
        ->setTo('you@example.com')
        ->setSubject('テストメール')
        ->setEmailFormat('both') // ← これを追加
        ->viewBuilder()
          ->setTemplate('sample')
          ->setVar('message', 'こんにちは、世界!');
      $mailer->deliver();
    }
  }
}

先の例と同様に、レイアウトは /templates/layout/email/text/default.php と/templates/layout/email/html/default.php が読み込まれています。setLayout() を使って別のレイアウトファイルを指定できます。

4. おわりに

システム開発をしているとメール送信を実装する機会は多いと思います。特に B to C の場合だと HTML メールを送る場面も良くありますね。

CakePHP ではこれらを簡単に実装することができます。特にテンプレートファイルで本文を組めるのは便利です。そしてレイアウトファイルの活用は保守性を高めるのに役立ちそうです。

メール送信を実装する際には仕様に応じて、そのあたりも考慮して作るといいのではないかと思います。