【CakePHP入門】メールを送信する方法

こんにちは!フリーエンジニアのせきです。

CakePHPには、メールを送信する機能が用意されています。

この記事では、

・CakePHPでメールを送信する方法を知りたい

という基本的な内容から、

・CakePHPでメール送信できない原因を知りたい

といった応用的な内容に関しても解説していきます。

今回はCakePHPでメールを送信する方法について、わかりやすく解説します!

メールを送信する方法

トランスポートの設定

トランスポートはメール送信に必要な様々な情報を持ちます。

トランスポートの設定は、「[プロジェクトのパス]/config/app.php」の’EmailTransport’で行います。

‘default’の部分は任意の名前をつけることができ、複数のトランスポートを設定することができます。

ここでつけた名前は、送信するプログラムから指定されます。

設定項目を順番に解説していきいます。

・className
Mail、Smtp、Debugのいずれかを指定します。

Mailを指定した場合は、PHPのmail関数を使用してメールを送信します。

Smtpを使用した場合は、これ以降で設定する外部のSMTPサーバを使用してメールを送信します。

Debugを指定した場合は、デバッグ用で実際にメール送信は行いません。

これ以降の項目は、classNameにSmtpを指定した場合のみ使用されます。

・host、port
使用するSMTPサーバのホスト名とポート番号を指定します。

・timeout
SMTPサーバへの接続のタイムアウト時間を指定します。

・username、password
SMTPサーバに接続するユーザ名とパスワードが必要な場合に指定します。

・tls
TLS(データを暗号化して送受信するプロトコル)を使用する場合はtrueを指定します。

設定値が文字列の場合はシングルクォーテーション(’)で囲んでください。

PHPのmail関数については、以下の記事で詳しく解説しています。

メールを送信する

メールを送信するにはEmailクラスを使用します。

そのため、以下のように送信するクラスでEmailクラスをロードするのを忘れないようにしてください。

最初にEmailインスタンスを作成します。

コンストラクタに定義しておいたトランスポートの設定名を指定することで、その設定でメールが送信されます。

コンストラクタでは指定せずに、setProfileメソッドを使用することもできます。

その後、Emailクラスのセッターメソッドを使用し、送信元や宛先などの設定を行います。

最後にsendメソッドで、指定した本文が送信されます。

宛先、CC、BCCが複数の場合はメールアドレスを配列で指定することができます。

これらの設定は、「[プロジェクトのパス]/config/app.php」の’Email’で行うことでもできます。

以下に簡単なメール送信のサンプルを紹介します。
[プロジェクトのパス]/src/Controller/MailController.php

[プロジェクトのパス]/src/Template/Mail/index.ctp

このサンプルを実行すると、以下のようなメールが送信されます。

Mailerを使用した送信方法

Mailerとは

CakePHP3.1.0からMailerクラスが追加され、メール送信機能をひとつのクラスにまとめることができるようになりました。

たとえば、ユーザ管理を行うアプリケーションで、ユーザ登録完了メール、ユーザ情報変更通知メール、ユーザ退会完了メールのように、ユーザに関連するメールをひとつのMailerクラスにまとめておくと、アプリケーションのどこからでもそのMailerクラスを使用して、ユーザにメールを送信することができます。

Mailerの使い方

Mailerクラスは[プロジェクトのパス]/src/Mailerに作成します。

この章では、ユーザ登録を行い、登録されたメールアドレスに登録完了メールを送信するアプリケーションを作成し、解説していきます。

以下のようなテーブルを作成します。

bakeで、Model、Template、Controllerを一括で作成します。

「[プロジェクトのパス]/bin」で、以下のコマンドを実行します。

次に、Mailerクラスを作成します。

[プロジェクトのパス]/src/Mailer/UserMailer.php
Emailクラスは「$this」でアクセスすることができます。

宛先の設定には「$user->email」を指定し、登録されたユーザのメールアドレスに送信されるようにしています。

setTemplateメソッドは、メールの本文にテンプレートを使用する時に使用します。

「setTemplate(‘register_mail’)」のように指定すると、「src\Template\Email\text\register_mail.ctp」がテンプレートとして使用されます。

テンプレートには変数を渡すことができviewVarsメソッドに「テンプレートでの変数名 => 渡す変数」の形式で指定します。

続けてテンプレートを作成します。

[プロジェクトのパス]/src\Template\Email\text\register_mail.ctp

Controllerで、Mailerクラスを使用してメール送信する処理を追加します。

[プロジェクトのパス]/src/Controller/UsersController.php
MailerAwareTraitクラスを使用するため、「use Cake\Mailer\MailerAwareTrait;」「use MailerAwareTrait;」の記述が必要です。

「$this->getMailer(‘User’)->send(‘register’, [$user]);」で、UserMailerクラスのregisterメソッドを引数$userで呼び出します。

引数が複数ある場合は、配列で指定することができます。

以下の画面に名前とメールアドレスを入力して、SUBMITボタンを押します。
mail

入力したメールアドレスに、以下のメールが送信されます。

bakeについては、以下の記事で詳しく解説しています。

メールを送信できない場合

メール送信に失敗するには、いくつかの原因が考えられます。

実行時に表示されることのあるエラーと原因です。

・Call to undefined method App\Controller\UsersController::getMailer()
MailerAwareTraitクラスがロードできていません。「use Cake\Mailer\MailerAwareTrait;」「use MailerAwareTrait;」の記述を見直してください。

・php_network_getaddresses: getaddrinfo failed:
SMTPサーバの設定が間違っている可能性があります。設定を見直してください。

・From is not specified.
送信元が指定されていません。送信元は必須ですので、app.phpの’Email’に設定するか、プログラムでsetFromメソッドを使用し設定してください。

宛先が間違っていてメールが届かない場合はエラーにはなりませんので、注意してください。

まとめ

今回はCakePHPでメールを送信する方法について解説しました。

会員登録を行うサイトなどの構築では、メール機能が必須となってきますので使い方をしっかり覚えましょう。

メールを送信する方法を忘れてしまったら、この記事を思い出して下さい!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

せき

せき

フリーランスでWebシステム開発やゲーム開発をしています。
読者の方にプログラミングの面白さをお伝えしたいです。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説