CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
2019/03/31
CakePHP3でメールを送信する処理を解説
CakePHP3でメールを送信する処理を解説します。
CakePHP3のメール送信処理の設定ファイル
まず最初に、CakePHP3のメール処理設定の確認です。
CakePHP3のメールの送信処理の設定情報は、「/config/app.php」にあります。190行目辺りでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'EmailTransport' => [ 'default' => [ 'className' => 'Mail', /* * The following keys are used in SMTP transports: */ 'host' => 'localhost', 'port' => 25, 'timeout' => 30, 'username' => null, 'password' => null, 'client' => null, 'tls' => null, 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null), ], ], |
上記はデフォルトの設定ですが、今回は上記の通り「’className’ => ‘Mail’」になっている状態での想定で解説をします。
この設定についても解説をしておくと、「className」に指定する値は、「Mail」「Smtp」「Debug」のいずれかです。
「Mail」が指定されている場合は、PHPの mail()関数を使用してメールを送信します。
「Smtp」が指定されている場合は、指定されてある SMTPサーバを使用してメールを送信します。
「Debug」が指定されている場合は、デバッグ用の処理として実行され、実際にメールの送信は行いません。
「host」から「url」までの設定は、「’className’ => ‘Smtp’」の設定となっている場合のみ有効です。
それ以外の時は使われませんのでデフォルトのままで問題ありません。
SMTPで送信するときは「Email」の設定が必要な場合も
「’className’ => ‘Smtp’」を設定している場合は、下記の「Email」の設定もする必要がある場合があります。
下記の設定の「from」が実際に送信するメールアドレスを設定します。
1 2 3 4 5 6 7 8 |
'Email' => [ 'default' => [ 'transport' => 'default', 'from' => 'you@localhost', //'charset' => 'utf-8', //'headerCharset' => 'utf-8', ], ], |
fromの値が実際に送信するメールアドレスになっていない場合は、メールの送信を拒否するメールサーバも多くありますので、この設定も確認します。
CakePHP3でメールを送信する基本形
CakePHP3で一番簡単な方法でメールを送信する場合は、以下のように設定します。
まずは、この設定でメールが送信できるかどうかを確認しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php namespace App\Controller; use App\Controller\AppController; // メール送信 use Cake\Mailer\Email; class InquiriesController extends AppController { (中略) // メール送信フォーム public function form() (中略) // メール送信処理 $email = new Email("default"); // 入力者へのメール $email->setFrom(["from@example.com"=>"送信元名"]) ->setTo("to@example.com") ->setCc("cc@example.com") ->setBcc("bcc@example.com") ->setSubject("お問合せありがとうございます。") ->send("お問い合わせの本文です"); (後略) |
まず、6行目の Emailクラスをロードする処理を記述します。
19行目で、Emailクラスのインスタンスを作成します。
作成したインスタンスに対して、22行目からあるように、メソッド・チェーンで必要なプロパティを設定していきます。
上記では setFrom()、setTo()、setCc()、setBcc()、setSubject()を使用していますが、これは、CakePHP3.4以降の仕様です。
CakePHP3.4より前のバージョンでは、from()、to()、cc()、bcc()、subject()を使用します。
setCc()、setBcc()の設定が必要ない場合は、設定の行ごと削除します。
「setCc("")
」のように、nullを設定するとエラーになります。
また、19行目でインスタンスを作成する処理は、下記の様に記述することもできます。
1 2 |
$email = new Email(); $email->setProfile("default"); |
上記で書いている setProfile()は、他の設定と同じく CakePHP3.4以降の仕様です。
CakePHP3.4より前のバージョンでは、profile()を使用します。
また、設定名の「default」を渡す代わりに、オプションの配列をロードすることもできます。
1 2 3 4 |
$email = new Email(["from" => "from@example.com", "transport" => "送信元名"]); // もしくは $email = new Email(); $email->setProfile(["from" => "from@example.com", "transport" => "送信元名"]); |
CakePHP3でメールを送信する際にテンプレートを使用する
メールフォーム(お問い合わせフォーム)などでメールを送信する場合は、メールの本文をプログラムの中に記述することはありません。
メールの本文は、テンプレートファイルとして別ファイルにし、そのファイルに変数を編集することでメールの本文を完成させます。
ここでは、テンプレートファイルを利用してメールを送信する方法を解説します。
テンプレートを指定する場合は、下記の 2~4行目のように setTemplate()、setLayout()、emailFormat()で指定します。
1 2 3 4 5 6 7 8 9 10 11 |
$email->setFrom(["from@example.com"=>"送信元名"]) ->setTemplate("inquiriesForm") ->setLayout("inquiriesFormLayout") ->emailFormat("text") ->setTo("to@example.com") ->setCc("cc@example.com") ->setBcc("bcc@example.com") ->setSubject("お問合せありがとうございます。") ->viewVars(["name"=>$this->request->data['name'], "ruby"=>$this->request->data['ruby']]) ->send("お問い合わせの本文です"); |
2行目の「setTemplate()」でテンプレートファイルを指定し、3行目の「setLayout()」でレイアウトファイルを指定します。
レイアウトファイルを指定しない場合は「setTemplate()」のみの設定で OKです。
テンプレートファイルを上記のように「inquiriesForm」と指定する場合は、下記のファイルが使われます。
/src/Template/Email/text/inquiries_form.ctp
レイアウトファイルを上記のように「inquiriesFormLayout」と指定する場合は、下記のファイルが使われます。
src/Template/Layout/Email/text/inquiriesFormLayout.ctp
上記のように複数単語の組み合わせでファイルを指定する場合は注意が必要です。
テンプレートファイルの指定が、「inquiriesForm」の場合の実ファイルは「inquiries_form.ctp」となります。
「inquiriesForm.ctp」では、「ファイルがありません」というエラーになります。
しかし、テンプレートファイルの指定が、「inquiriesFormLayout」の場合の実ファイルは「inquiriesFormLayout.ctp」となります。
「inquiries_form_layout.ctp」では、「ファイルがありません」というエラーになります。
4行目の「emailFormat()」で指定する引数は「text」です。
これは「text」タイプのメールを送信することを指定していることになります。
「html」とすると「html」タイプのメールを送信し、「both」とすると「text」「html」の両方を使うマルチパートのメールを送信します。
「html」タイプのテンプレートファイルは、以下のものになります。
src/Template/Email/html/inquiries_form.ctp
src/Template/Layout/Email/html/inquiriesFormLayout.ctp
ちなみに、CakePHP3.4以降は上記で解説したように「setTemplate()」「setLayout()」で設定します。
ですが、CakePHP3.4より前のバージョンでは、「template(“inquiriesForm”, “inquiriesFormLayout”)」のように、「template()」で指定します。1つ目の引数がテンプレートのファイルで、2つ目がレイアウトのファイルです。
9行目、10行目が、テンプレートに編集する値を指定している箇所です。
「viewVars()」を使って値を指定します。
値の指定は連想配列で「変数名 => 値」のように指定します。
上記の例では、「名前」として入力された「name」という値と、「ふりがな」として入力された「ruby」という値を編集している想定です。
また、テンプレートファイル「inquiries_form.ctp」の中身は以下のようになります。
「viewVars()」で指定した変数が編集されます。
1 2 3 4 |
<?php echo "なまえ :" . $name . "\n"; echo "ふりがな:" . $ruby . "\n"; echo $content; |
また、「$content」には、「send()」で指定した引数の文字列が編集されます。
上記の例では「お問い合わせの本文です」の文字列が入ります。
「send()」はメールを送信する処理そのものですので、「viewVars()」なども含め設定情報は全て、「send()」より前に記述します。
(私は「send()」の後に「viewVars()」を書いていて、何で動かないのか、しばらく悩んでいました。)
また、上記の例では「send()」に引数を入れていますが、テンプレートに編集する値をすべて「viewVars()」で指定しているのであれば、「send()」に引数を指定する必要はありません。
レイアウトファイル「inquiriesFormLayout.ctp」の中身は以下のようになります。
「$this->fetch(‘content’)」を記述した場所に、テンプレートファイルの中身が編集されます。
1 2 |
<?php echo $this->fetch('content'); |
CakePHP3でメールを送信する際に添付ファイルを一緒に送信する方法
CakePHP3でメール送信時に添付ファイルを一緒に送信する場合は「attachments()」を使用します。
1 2 3 4 5 6 7 8 9 |
$email->setFrom(["from@example.com"=>"送信元名"]) ->setTemplate("inquiriesForm") ->emailFormat("text") ->setTo("to@example.com") ->setSubject("お問合せありがとうございます。") ->viewVars(["name"=>$this->request->data['name'], "ruby"=>$this->request->data['ruby']]) ->setAttachments("/xampp/htdocs/webroot/img/example.gif") ->send("お問い合わせの本文です"); |
一番ベーシックな「attachments()」の使い方が上記の記述方法です。
引数として、添付するファイルをフルパスで指定します。
この場合の「フルパス」はサーバのルートからのフルパスです。
ドキュメントルートからのフルパスではありません。
また、指定したファイルがない場合はエラーとなりますので、実処理上はファイルのありなしのチェックが必要です。
ただ、「null」を指定した場合は、「webroot」という 0バイトのファイルが添付されてきます。
ちなみに、CakePHP3.4以降は上記で解説したように「setAttachments()」で設定します。
ですが、CakePHP3.4より前のバージョンでは、「attachments()」で指定します。
下記の様に配列として指定することで複数のファイルを添付することができます。
動作は前項の文字列として指定した場合と同じです。
1 2 |
->setAttachments(["/xampp/htdocs/webroot/img/example.gif", "/xampp/htdocs/webroot/img/example2.gif"]) |
下記の様に連想配列でファイルを指定すると、ファイル名は、キーとして指定したファイル名で添付されます。
1 2 |
->setAttachments(["abc.gif"=>"/xampp/htdocs/webroot/img/example.gif", "def.gif"=>"/xampp/htdocs/webroot/img/example2.gif"]) |
ファイル名の重複や日本語ファイル名などによる不具合を避けるために、アップロードされたファイル名を付けなおしている場合などは、このようにして元のファイル名を付けなおして送信する、といった処理が必要になるでしょう。
さらに、下記の様に「mimetype」「contentId」を付与する方法もあります。
1 2 3 4 |
->setAttachments(["abc.gif"=>[ "file" =>"/xampp/htdocs/webroot/img/_black.gif", "mimetype" => "image/gif", "contentId" => "12345"]]) |
CakePHP3でメールを送信する方法についての解説まとめ
これまで解説した内容があれば、メールフォーム(お問い合わせフォーム)からメールを送信する処理は作成できるかと思います。
今回は、SMTPサーバに接続する方法や、メールトランスポートを使用する方法などは解説していませんので、それらの解説についてはまたいずれ解説記事を書く予定です。
CakePHP3の関連記事
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールするCakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
CakePHP4でcontrollerで実行したバリデーションの結果をModelのバリデーション結果に追加するメソッド「setError()」「setErrors()」の使い方の解説。
-
CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法
CakePHP3で検索をするプラグイン「friendsofcake/search」の検索条件のカスタマイズ方法の解説。検索項目を増やしたり、以上、以下での検索や、チェックボックスによる検索の方法などを解説。
-
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。
-
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。
-
CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説
CakePHP3で定数や共通で使う変数をまとめて設定し、プログラム内で読み込む方法を、bootstrap.phpに直接記述する方法と定数ファイルを分ける方法の3つの方法で解説。
-
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3でデフォルトのソート条件を設定しつつ画面上でユーザがソート条件を選択したときもソート処理を実行させる方法を解説。ソート条件はページネーションの処理として実装。
-
CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法
CakePHP3でテンプレートファイルやレイアウトファイルをデフォルトのものから別のものに変更したい場合の指定方法を解説。
-
CakePHP 2.3 コマンドラインからPHPのシェル実行の方法解説
CakePHP 2.3でコマンドラインから CakePHPで記述した処理を実行する方法を解説します。
-
CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説
WYSIWYGエディタであるCKEditor4をCDNを利用して簡単にCakePHP3に導入する方法とカスタマイズする方法を解説。CakePHP3にはページごとの振り分けを行うブロック化を利用する。
-
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でテーブルの数値項目に対してlike句を使用した部分一致検索を実行するとエラーが発生する。クリエービルダーの不具合だと思われ対処方法が分からない。