相変わらず仕事ではまったく触れるのことのない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);
	}
}

そのままテンプレートとか使えるのは最高ですね。
分けたければファイルを増やせばいいだけですしね。