
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をそのまま編集しても構いません。
面倒くさいので、そのまま編集しました。
編集前
[php]
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',
);
[/php]
使用するサーバのSMTP設定を基に、上記編集前を以下のように編集。
[php]
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',
);
[/php]
"log" を true とすることで、送信時に app/tmp/logs/debug.log へ送信内容を記録してくれる親切設計です。
手順3 メールテンプレートを編集
メール送信する際は、メールテンプレートを介して送信するので、そのテンプレを作成します。
テキストメールを送信するので、app/View/Emails/text/ に、text_mail.ctp を作成。
中身はこれだけでOKです。
[php]
様
[/php]
日本語を含む場合は、文字コードはUTF-8で保存。
HTMLメールの場合は、app/View/Emails/html/ にテンプレを作成、設置します。
手順4 コントローラーを編集
適当にコントローラー/アクションを作成。
テストなので、EmailController という分かりやすい名前にしてみました。
App::uses('CakeEmail', 'Network/Email'); は、AppControllerに記述してもOK。個人的にはそちらの方が好きかも。
送信先がひとつだけの場合は、単純にメールアドレスを文字列で渡せばOK。
複数設定したい場合は送信先を配列にして渡すことで、複数の送信先が設定可能です。
[php]
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 'メール送信失敗' ;
}
}
[/php]
メールテンプレートに、レイアウトを使ってみる
上記例ではメールテンプレートは「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
[php]
-----------------------------------------
このメールは、「●●●●」より自動送信されています。
-----------------------------------------
-----------------------------------------
●●●●株式会社
〒***-0000
大阪市◆◆区◆◆町**-***-**
Tel:06-****-**** Fax:06-****-****
Email:info@******.co.jp URL:http://******.jp
[/php]
テンプレを作ったら、コントローラーの記述を少し変更。
template部分を、('ビューファイル', 'レイアウトファイル')とします。
実例はこんな感じで。
[php]
->template('text_mail', 'default')
[/php]
ちなみに、テンプレートを利用しないこともできます。
template() とか viewVars() を使わずに、send() の引数に送信内容を直接入れればその内容が送信されます。
結構、簡単に使えるようなので、DBに登録しているテンプレートを使うなど、色々試してみたいと思います。
[tgAmazonItemLookup asin="4088707702" related="1"]