CakePHP2.xで、CakeEmailを使ってメール送信してみる。
2015/01/11
CakePHP1.3の時はqdmailを使ってメール送信していましたが、2系統ではデフォルトで実装されている「CakeEmail」というコアライブラリを使ってメール送信するのがスマートなやり方のようです。
とりあえず、CakeEmailでメール送信する時はどうするのかを忘備録代わりにポストです。
なお、CakePHPは、2.3.6を使っています。
CakeEmail設定
手順1 ファイル名を変更
「.default」を消して、拡張子をphpとします。
app/Config/email.php.default
↓↓↓
app/Config/email.php
手順2 app/Config/email.phpを編集
元々の設定で、「default」、「smtp」、「fast」という3つの配列があります。
CakePHP1.3ではずーっとqdsmtpを使っていたので、その流れをくんで、SMTPを使って送信してみます。
なので、配列 $smtp を編集。
あとで設定を呼び込むところで設定した別名配列を呼べるので、別名を作っても構いませんし、smtpをそのまま編集しても構いません。
面倒くさいので、そのまま編集しました。
編集前
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public $smtp = array( 'transport' => 'Smtp', 'from' => array('site@localhost' => 'My Site'), 'host' => 'localhost', 'port' => 25, 'timeout' => 30, 'username' => 'user', 'password' => 'secret', 'client' => null, 'log' => false, //'charset' => 'utf-8', //'headerCharset' => 'utf-8', ); |
使用するサーバのSMTP設定を基に、上記編集前を以下のように編集。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public $smtp = array( 'transport' => 'Smtp', 'from' => array('fromaccount@example.com' => 'TEST Site'), 'host' => 'hostname.example.com', 'port' => 587, 'timeout' => 30, 'username' => 'username@example.com', 'password' => 'password', 'client' => null, 'log' => true, 'charset' => 'utf-8', 'headerCharset' => 'utf-8', ); |
"log" を true とすることで、送信時に app/tmp/logs/debug.log へ送信内容を記録してくれる親切設計です。
手順3 メールテンプレートを編集
メール送信する際は、メールテンプレートを介して送信するので、そのテンプレを作成します。
テキストメールを送信するので、app/View/Emails/text/ に、text_mail.ctp を作成。
中身はこれだけでOKです。
1 2 3 |
<?php echo $name; ?> 様 <?php echo $content; ?> |
日本語を含む場合は、文字コードはUTF-8で保存。
HTMLメールの場合は、app/View/Emails/html/ にテンプレを作成、設置します。
手順4 コントローラーを編集
適当にコントローラー/アクションを作成。
テストなので、EmailController という分かりやすい名前にしてみました。
App::uses('CakeEmail', 'Network/Email'); は、AppControllerに記述してもOK。個人的にはそちらの方が好きかも。
送信先がひとつだけの場合は、単純にメールアドレスを文字列で渡せばOK。
複数設定したい場合は送信先を配列にして渡すことで、複数の送信先が設定可能です。
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 |
App::uses('CakeEmail', 'Network/Email'); class EmailsController extends AppController { public function send() { // メール内容 $mailbody = array( 'name' => '山田太郎', 'content' => "テスト送信です。\nあああああ\n\n123", ); // メール送信実行 $email = new CakeEmail('smtp'); // ←手順2で編集した配列名を指定 $sent = $email ->template('text_mail') // ←テンプレ名 ->viewVars($mailbody) // ←メール内容配列をテンプレに渡す ->from(array('送信元アドレス' => '送信元名')) ->to('送信先アドレス') ->subject('件名') ->send(); if ( $sent ) { echo 'メール送信成功!' ; } else { echo 'メール送信失敗' ; } } |
メールテンプレートに、レイアウトを使ってみる
上記例ではメールテンプレートは「text_mail.ctp」単体での使用方法ですが、CakeEmailでは他のビュー同様、レイアウトを指定し、共通のヘッダやフッタを利用する事が可能です。
例えば、以下の様なメール内容にしたい場合、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
----------------------------------------- このメールは、「●●●●」より自動送信されています。 ----------------------------------------- ここにメール内容 ----------------------------------------- ●●●●株式会社 〒***-0000 大阪市◆◆区◆◆町**-***-** Tel:06-****-**** Fax:06-****-**** Email:info@******.co.jp URL:http://******.jp |
もう、予想はつくと思いますが、以下のようにします。
app/View/Layouts/Emails/text/default.ctp
1 2 3 4 5 6 7 8 9 10 11 12 13 |
----------------------------------------- このメールは、「●●●●」より自動送信されています。 ----------------------------------------- <?php echo $content_for_layout;?> ----------------------------------------- ●●●●株式会社 〒***-0000 大阪市◆◆区◆◆町**-***-** Tel:06-****-**** Fax:06-****-**** Email:info@******.co.jp URL:http://******.jp |
テンプレを作ったら、コントローラーの記述を少し変更。
template部分を、('ビューファイル', 'レイアウトファイル')とします。
実例はこんな感じで。
1 |
->template('text_mail', 'default') |
ちなみに、テンプレートを利用しないこともできます。
template() とか viewVars() を使わずに、send() の引数に送信内容を直接入れればその内容が送信されます。
結構、簡単に使えるようなので、DBに登録しているテンプレートを使うなど、色々試してみたいと思います。
[tgAmazonItemLookup asin="4088707702" related="1"]