相変わらず仕事ではまったく触れるのことのない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]
<?php
class EmailConfig {
public $gmail = array(
‘host’ => ‘ssl://smtp.gmail.com’,
‘port’ => 465,
‘username’ => ‘ユーザー名’,
‘password’ => ‘パスワード’
);
}
[/php]
テンプレートの設定
画面と同じように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]
<?php echo $content_for_layout; ?>
会社名〜〜〜〜
URL〜〜〜〜
電話番号〜〜〜〜
[/php]
同じようにViewも修正します。
コピーした以下のviewにはメール本文を記述します。
app/View/Emails/text/default.ctp
本文を直接記述してもいいですが、動的に変わる部分は変数にします。
同じように適当にファイル名も変えておきます。text_mail.ctpにしました。
[php]
<?php echo $name; ?> 様
<?php echo $msg; ?>
[/php]
メール送信
Controllerにメール送信処理を記述します。
まず必要なファイルを読み込みます。まぁ1つだけなんですけどね。
[php]
App::uses(‘CakeEmail’, ‘Network/Email’);
[/php]
メール本文を設定し送信します。
[php]
// テンプレートに送る変数
$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);
[/php]
$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]
<?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);
}
}
[/php]
そのままテンプレートとか使えるのは最高ですね。
分けたければファイルを増やせばいいだけですしね。