CakePHP2でメール送信を手軽に行うための実装CakeEmailを使ってみたら本当に簡単すぎて便利、メールフォームがなくてもメール送信機能だけで

[Sponsored Link]


当ブログでは「役に立った!」「写真使いました!」などご参考頂いた方からのAmazonギフト券の寄付をお待ち致しております。

Share on FacebookTweet about this on TwitterShare on Google+Share on TumblrPin on PinterestShare on LinkedInDigg this

CakePHP2では、電子メールを使うための機能として標準提供されている「CakeEmail」という実装がある。この実装は簡単な設定だけでメール送信が実現できるというものだ。UNIX系OSであればローカルのメール配送システムを使うことも出来るし、SMTPサーバを指定して他のメール配送システムを利用してメールを送信することもできる。app/Config/database.phpのように複数の設定を記述しておき、利用時に選択することもできる。パラメータを使用時に調整することもできる。などなど、いろいろと便利に出来ているのだ。


設定順としては、以下の順になるだろう。

app/Config/email.php
app/Controller/XxxController.php (Xxxは任意)

ちなみに私はどのコントローラーでも共通で使用できるようにapp/Controller/AppController.php に設定することにしている。こうすれば、どのコントローラーからでも$this->send_email($data);などのように利用することができて便利だからだ。

まずはapp/Config/email.phpの作成だが、これはdatabase.phpと同様に、app/Config/email.php.defaultファイルが存在するので、これをコピーして修正するだけでよいだろう。

# cd app/Config
# cp email.php.default email.php

UNIX系OSなら、ローカルのメール配送システム(mailコマンドなりsendmailコマンドなり)が利用できるので、その設定から。

        public $mail = array(
                'transport' => 'Mail',
                'from' => array('taro@zura.org' => 'Ezura Taro'),
                'to' => array('hanako@zura.org' => 'Ezura Hanako'),
        );

database.phpに記述するデータベースの設定と似ているだろう。
transportを「Mail」で指定すると、ローカル配送システムを使うことになる。おそらくWindowsではMailは機能しないだろう。この場合は次のように「Smtp」を指定して、さらにSMTPホストやポート番号などの情報を付加する必要がある。
from、toはメール配送時に使用される差出人アドレス(from)と受取人アドレス(to)になる。
これらのパラメータはCakeEmailオブジェクトを生成した後に変更することも可能だ。

そして以下はGmailをSMTPサーバに使用する例。SSLを使用するので、hostの指定には「ssl://」と指定する必要がある。

    public $gmail = array(
        'transport' => 'Smtp',
        'host' => 'ssl://smtp.gmail.com',
        'port' => 465,
        'username' => 'mygmail@gmail.com',
        'password' => 'xxxyyyzzz',
    );

それ以外にもいろいろと設定項目があるが、とりあえずemail.phpではこの程度にしておく。

設定ファイルの記述が終わったら、AppController.phpに必要な記述を書く。
最初に必要な記述はCakeEmailクラスの使用を宣言である。App::uses()はAppControllerクラスの定義より前に記述しておけばよい。

App::uses('CakeEmail', 'Network/Email');

AppControllerクラスの中に、メールを送信するためのメソッドを実装する。このメソッド名は任意であり、必ずしも以下のメソッド名でなければならない、というわけではない。

        protected function send_email($data)
        {
                $date = date('Y年m月d日 H時i分s秒');
                $subject = $data['subject'] . " ($date)";
                $body = $data['body'];

                $mail = new CakeEmail('mail');
                $mail->config(array('log' => 'maillog'))
                        ->subject($subject)
                        ->send($body);
                return true;
        }

ここではsend_email()というメソッドにしている。これでAppControllerクラスを継承している他のコントローラーからでも$this->send_email()として使うことができる。
3行目は件名に含める日時を取得している。別にこれは必要な要素ではない。単にここでの実装例というだけだ。
4行目、5行目は引数として受け取った配列から、それぞれ件名と本文を取り出している。これも特段この形にする必要があるわけでもない。また、ここではエラー処理などもしていないので、本来ならエラー処理などを盛り込むべきだろう。

[Sponsored Link]


7行目からが本題で、CakeEmailクラスのインスタンスをnewしている。コンストラクタに引数を渡しているが、これはどの設定を使用するかを意味している。さきほど設定ファイルで$mail = array(…)で設定したが、ここで「CakeEmail(‘mail’)」のように指定することで、$mailの設定を採用すことができる。
8行目はconfig()メソッドでログを指定している。array(‘log’ => ‘maillog’)を指定すると、app/tmp/logs/maillog.logというファイルにメール送信に関する記録が取られるようになる。
9行目では件名、10行目では本文を指定している。config()メソッドやsubject()メソッドなど、CakeEmailクラスのメソッドは返り値がオブジェクトであることから、このように多段的に指定することができるようだ。もちろん、すべて「$mail->subject($subject);」などのように分離して個別に宣言することもできる。
10行目のsend()メソッドを実行してメールが送信される。

他のコントローラーからこのメソッドを呼び出すには、以下のようにすればよい。ヒアドキュメント(「< <<」~「_EOL_;」で代入している個所)は、特にCakeEmailの利用に関係はない。 [php] $data['subject'] = "○○について"; $data['body'] = <<< _EOL_ 本文です。 ××です。 ○○です。 -- えづら _EOL_; $this->send_email($data); [/php] Webアプリ開発を加速する CakePHP2定番レシピ119CakePHP2 実践入門 (WEB+DB PRESS plus)PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)最高級洋菓子 ウィーンの銘菓ザッハトルテ チョコレートケーキ 12cm 本州送料340円最高級洋菓子 フランスの銘菓 ヴァルトベーレ 木いちごチョコレートケーキ 直径15cm小岩井 純水りんご 1.5L×8本

Share on FacebookTweet about this on TwitterShare on Google+Share on TumblrPin on PinterestShare on LinkedInDigg this

当ブログでは「役に立った!」「写真使いました!」などご参考頂いた方からのAmazonギフト券の寄付をお待ち致しております。


Atsushi Ezura について

ナチュラルな女性のしぐさや表情を撮りたいIT系エンジニア。女性モデル募集中プロフィール
カテゴリー: CakePHP, ウェブ, コンピュータ タグ: , パーマリンク

CakePHP2でメール送信を手軽に行うための実装CakeEmailを使ってみたら本当に簡単すぎて便利、メールフォームがなくてもメール送信機能だけで への1件のフィードバック

  1. ピンバック: CakePHP2 メール | 今きになった事

コメントを残す

メールアドレスが公開されることはありません。