相変わらず仕事ではまったく触れるのことのないCakePHPをひたすら触ってます。
Cake楽しくて楽しくてしょうがない感じです。どうしよ。
CakePHP2.0のCakeEmailでメールを送信してみました。
参考にしたのは以下。ありがとうございます。
http://bimi.jpn.com/?p=188
環境
- CakePHP2.0.5
- PHP5.3.8
Emailの設定
configファイルにEmailの設定を行います。
以下のファイルをコピーして「email.php」に変更します。
app/Config/email.php.default
設定ファイルの中身はこんな感じ。今回はgmailで試したのでgmailになっているけど、これは何でもよいかと。
<?php class EmailConfig { public $gmail = array( 'host' => 'ssl://smtp.gmail.com', 'port' => 465, 'username' => 'ユーザー名', 'password' => 'パスワード' ); }
テンプレートの設定
画面と同じようにLayoutsとViewがあるので設定します。
まず以下の2つのディレクトリをコピーして自分のアプリケーション側にコピーします。
Layouts
/lib/Cake/View/Layouts/Emails
View
/lib/Caka/View/Emails
上記でコピーしたディレクトリのLayoutsを修正します。
app/View/Layouts/Emails/text/default.ctp
まさ中身は何でもいいのですが、共通して表示するようなフッターとかの内容を記述するのが一般的かと思います。
で、 $content_for_layout という記述だけしておいてください。
ここに実際の内容が入ってきます。
あと適当にファイル名も変えておきましょう。今回はtext_layout.ctpとかにしました。
<?php echo $content_for_layout; ?> 会社名〜〜〜〜 URL〜〜〜〜 電話番号〜〜〜〜
同じようにViewも修正します。
コピーした以下のviewにはメール本文を記述します。
app/View/Emails/text/default.ctp
本文を直接記述してもいいですが、動的に変わる部分は変数にします。
同じように適当にファイル名も変えておきます。text_mail.ctpにしました。
<?php echo $name; ?> 様 <?php echo $msg; ?>
メール送信
Controllerにメール送信処理を記述します。
まず必要なファイルを読み込みます。まぁ1つだけなんですけどね。
App::uses('CakeEmail', 'Network/Email');
メール本文を設定し送信します。
// テンプレートに送る変数 $ary_body = array ( 'name' => 'テストnameです', 'msg' => 'テストです。ありがとうございました。', ); // 設定読み込み $email = new CakeEmail('gmail'); // 送信! $mailRespons = $email->config(array('log' => 'emails')) ->template('text_mail', 'text_layout') ->viewVars($ary_body) ->from(array('*******@*******.com' => '*******@*******.com')) ->to('*******@*******.com') ->cc('*******@*******.com') ->subject('テストタイトルですよ') ->send(); debug($mailRespons);
$ary_bodyの中にテンプレートで表示する内容を設定します。
設定した$ary_bodyはviewVarsの引数として渡します。これでテンプレートで読み込まれます。
以下の部分でConfigのemail.phpで設定した内容を読み込みます。
$email = new CakeEmail(‘gmail’);
どのテンプレートを使うか以下で設定しています。
最初の引数がViewで2つ目がLayoutです。
->template(‘text_mail’, ‘text_layout’)
あとは適時設定してsend()で送信!
これで、通常app/tmp/logs/emails.logというログができるので送信内容を確認してみます。
ただ、これだけだと実際に送信出来たどうかわかりませんので、サーバー側のメールログも確認してみてください。
Macだと/var/log/mail.logに結果が出力されているはずです。
色々出てると思いますが、status=deferredなどstatus=sent以外になっている場合は送信できてないと思われます。
ちなみにこのままの状態でShellでもメール送信できます。
Shellは以下のディレクトリに配置します。
app/Console/Command
TestShell.php
<?php class TestShell extends AppShell { public function main() { App::uses('CakeEmail', 'Network/Email'); // テンプレートに送る変数 $ary_body = array ( 'name' => 'テストnameです', 'msg' => 'テストです。ありがとうございました。', ); $email = new CakeEmail('gmail'); $mailRespons = $email->config(array('log' => 'emails')) ->template('text_mail', 'text_layout') ->viewVars($ary_body) ->from(array('*******@*******.com' => '*******@*******.com')) ->to('*******@*******.com') ->cc('*******@*******.com') ->subject('テストタイトルですよ') ->send(); debug($mailRespons); } }
そのままテンプレートとか使えるのは最高ですね。
分けたければファイルを増やせばいいだけですしね。