【初心者用】CakePHPを学んでいこう⑥(メール機能)

前回はCakePHPのバリデーション機能についての説明・実装方法について紹介しました。

今回はローカル環境でメールを送信する方法についてご紹介します。

1. 環境


OS:Windows11

XAMPP:8.0.25 (PHP8.0.25)

Composer:2.5.1

CakePHP:4.4


用意するもの

Gmailアドレス

 今回は「Gmail」のSMTPサーバを使ってメール送信を行います。
 つまり、こちらの送信アドレスをGmailアドレスを使用して送信することができます。
 送信用のGmailアドレスをご用意ください。

2. SMTPとは?

「Gmail」のSMTPサーバと上記で説明しましたが、そもそもSMTPとは何かを簡単に紹介します。

SMTPは「Simple Mail Transfer Protocol(シンプル・メール・トランスファー・プロトコル)」の略で、メール送信する仕組みのことです。

そもそも、メールは自分たちのコンピュータから相手のコンピュータへ直接送信しているのではなく、メールサーバを経由して相手側へ届けられています。


送信者が送信ボタンを押すと、まずは送信側のメールサーバへ送られ、その送信側メールサーバから相手側のメールサーバへ、そして本人にメールが届く仕組みになっています。

相手側のメールサーバまで届ける役割を、SMTPが担っています。


送信の役割はSMTPですが、受信は「POP(Post Office Protocol)」または「IMAP(Internet Message Access Protocol)」という仕組みを利用しています。

3. Googleアカウントを設定する

それではメールを送信するため、送信用Gmailの設定を修正していきます。

3-1. 2段階認証プロセスを有効にする

設定の前提条件として、2段階認証プロセスがオンになっている必要があります。

オンになっていない場合は、以下のリンクをクリックしてオンになるよう設定してください。

https://myaccount.google.com/security

3-2. アプリパスワードを生成する

CakePHPからGmailにアクセスするために必要なパスワードを生成します。

「アプリパスワード」のリンクをクリックしてください。


生成するアプリの名称やデバイスを選択する画面へ遷移します。

この名称やデバイスは任意のもので大丈夫です。自分がわかりやすいよう設定しておいてください。


「生成」ボタンを押すと、パスワードが生成されます。

この黄色い枠に書かれたパスワードは後で使用するため、コピーしておきます。

4. SMTP設定情報をセットする

これでSMTPをセットする準備ができたので、CakePHP側でSMTPの情報を登録します。

以下のファイルを開いてください。

../cake_pjt/config/app_local.php

「EmailTransport」というワードで検索すると、メールの構成がデフォルトで記載されています。

GmailのSMTP情報を設定していきます。

        'gmail' => [
            'host' => 'smtp.gmail.com',
            'port' => 587,
            'username' => '送信アドレス', //    ・・・①
            'password' => 'パスワード', //        ・・・②
            'className' => 'Smtp',
            'tls' => true
        ],

GmailのSMTPサーバは「smtp.gmail.com」、ポートは「587」となります。

①は送信用Gmailアドレス、②は先ほど生成したパスワードを記載します。

5. メール送信処理を実装する

では、以前作成したお問い合わせフォームにメール送信機能を実装してみましょう。

お問い合わせ画面から送信した際に、入力者へお問い合わせ内容が正常に送られたお知らせを通知します。

以下のファイルを開きます。

../cake_pjt/src/Controller/FormsController.php

    /**
     * confirm method
     *
     */
    public function confirm()
    {
        if ($this->session->check('inputs')) {
            $inputData = $this->session->consume('inputs'); // ・・・①
            $mail = $inputData['mail'];
            $name = $inputData['name'];
            $message = $inputData['contents'] . "\n";

            $mailer = new Mailer(); // ・・・②
            $mailer->setTransport('gmail'); // ・・・③
            $mailer
            ->setEmailFormat('text') // ・・・④
            ->setFrom(['po12oh.20@gmail.com' => 'テストサイト'])
            ->setTo($mail)
            ->setSubject('お問い合わせありがとうございます')
            ->setViewVars(['name' => $name, 'message' => $message]) // ・・・⑤
            ->viewBuilder() // ・・・⑥
                ->setTemplate('send'); // ・・・⑦
            try {
                $mailer->deliver();
            } catch (\Exception $e) {
                return $this->redirect(['action' => 'index']);
                $this->Flash->error(__('送信に失敗しました'));
            }
        }
    }

処理を特に書いていなかった「confirm」メソッドですが、お問い合わせ内容保存後にメールを送信するため、このメソッドに処理を書きます。

処理の流れは、入力されたメールアドレス宛にあらかじめ用意していたテンプレートに件名・本文をセットして送信しています。

上から順に見ていきましょう。


①まず一時的にセッションへ保存していた情報を取得しています。

セッション情報をセットする方法は以下の通りです。

    /**
     * init
     *
     */
    public function initialize(): void
    {
        $this->loadComponent('Flash');
        $this->session = $this->getRequest()->getSession();
    }

initializeでセッション情報を取得するよう用意しておきます。

そして、お問い合わせ内容を登録する前にセッション情報をセットしておきます。

     :
            $inputData = $this->request->getData();
            $this->session->write('inputs', $inputDat

6. 動作確認

実際にメールが送信されるか確認していきます。

http://localhost/cake_pjt/forms/

お問い合わせ内容を入力していきます。


送信ボタンを押して「送信しました。」画面が表示されれば成功です。

入力したメールアドレス先に届いていることも確認できました。

7. おまけ

今回CakePHPの環境に、直接SMTP情報を記載してメール送信を行いましたが、CakePHPのメーラーはPHPのmail関数を呼び出して送信することもできます。

PHP側に設定値を書いてCakePHP側では呼び出すだけ、という書き方もできますので、XAMPP環境での対応方法を記載しておきます。


①XAMPPを停止して、以下のファイルを修正します。

C:/xampp/php/php.ini

sendmail_from = 送信メールアドレス
sendmail_path = "C:\xampp\sendmail\sendmail.exe -t"


②さらに、以下のファイルを修正します。

C:/xampp/sendmail/sendmail.ini

smtp_server=smtp.gmail.com
smtp_port=587
smtp_ssl=auto
auth_username=送信Gmailメールアドレス
auth_password=生成したパスワード


③再度XAMPPでapache・MySQLを起動します。

④PHPのmail関数を呼び出してメールを送信する場合は、先ほどの「app_local.php」を開き以下のように記載します。

        'default' => [
            'className' => 'Mail',
        ],


これでPHPのmail関数を使用してメールが送信されるようになります。

8. まとめ

ローカル環境のCakePHPでメールを送信する方法についてご紹介しました。

CakePHPでは既に便利なmailerが用意されているため、簡単に実装することができます。

mailerクラスは今回紹介した機能以外にも、様々な機能が用意されているのでぜひ調べてみてください。

次回はCakePHPを使ったAPIの実装方法についてご紹介いたします。