Home > CakePHP > CakePHPでメールを送信する

CakePHPでメールを送信する

  • Posted by: zaru
  • 2008年5月28日 15:53
  • CakePHP

CakePHPでメール送信の方法はいくつかありますが、微妙に使い勝手が悪かったり、不安定だったりしたので、CakePHP1.x系で動くメール送信コンポーネントを作ってみました。

コンポーネントと言っても、実際はPHPMailerのラッパーです。しかも、PHPMailerを日本語環境で使いやすくしたJPHPMailerのラッパーにCakePHPのVIEWを使えるようにカスタマイズしただけで、僕が書いたコードは10行ちょっとです(汗)。

PHPMailerとJPHPMailerに感謝をしつつ公開します。

インストール方法

インストールはいたって簡単で、まずはPHPMailerをダウンロードしてきます。

ダウンロードして解凍したフォルダをそのまま /vendors ディレクトリに配置します。

次に、cakemail.php をダウンロードして /app/controllers/components ディレクトリに配置します。

これでインストール自体は完了です。

設定方法

メール送信コントローラ(今回は mail_controller.php とします)から cakemail を読み込みます。

class MailController extends AppController {
    var $name = 'Mail';
    var $uses = null;
    var $components = array ('Cakemail');
    var $helpers = array('html','javascript');
    var $pageTitle = 'メール送信';
}

なお、モデルは使わないので、 var $uses = null; としています。

VIEWファイルとLAYOUTファイルの設置

CakePHPを使うなら、メールのテンプレートもCakePHPのVIEWを使いたい、ということで、 /app/views/ 以下にそれぞれ VIEWファイルと LAYOUTファイルを設置します。

VIEWファイル
テキストメール設定ディレクトリ:/app/views/elements/email/text/*.thtml
HTMLメール設定ディレクトリ:/app/views/elements/email/html/*.thtml
LAYOUTファイル
テキストメール設定ディレクトリ:/app/views/layouts/email/text/*.thtml
HTMLメール設定ディレクトリ:/app/views/layouts/email/html/*.thtml

テキストメールとHTMLメールどちらでも送ることができます。それぞれ使いたい方のディレクトリにファイルを配置してください。

送信方法

mail_controller.php にメール送信するコードを書きます。

class MailController extends AppController {
    var $name = 'Mail';
    var $uses = null;
    var $components = array ('Cakemail');
    var $helpers = array('html','javascript');
    var $pageTitle = 'メール送信';

    function index(){
    
        //メール本文の設定
        $content = array('hoge' => 'ほげですよー',
                         'piyo' => 'ぴよぴよですよー',
                        );
    
        //メール送信の設定
        $to       = 'zarutofu@gmail.com';
        $cc       = 'zaru@tofu-kun.org';
        $subject  = 'メールタイトル:長いタイトルもOK?CakePHPでメールを送信するコンポーネントテスト';
        $from     = 'zaru@tofu-kun.org';
        $fromname = 'CakePHP テスト';
        
        //添付ファイルの設定
        $file     = array(WWW_ROOT . 'files/attach.jpg',
                          WWW_ROOT . 'files/attach.zip',
                         );
        
        $this->Cakemail->ClearAddresses(); //アドレスクリア
        $this->Cakemail->addTo($to);
        
        $this->Cakemail->ClearCCs(); //CCアドレスクリア
        $this->Cakemail->addCc($cc);
        
        $this->Cakemail->setFrom($from,$fromname);
        
        $this->Cakemail->setSubject($subject);
        
        $this->Cakemail->setType = 'text'; //html or text
        
        //添付ファイル追加
        $attach = array();
        if(isset($file)){
            foreach($file as $fileName){
                if(file_exists($fileName)){
                    $this->Cakemail->AddAttachment($fileName);
                }
            }
        }
        
        $this->Cakemail->setBody($content,'mailsend_view','mailsend_layout'); //viewとlayoutの設定
        
        if (!$this->Cakemail->send()){
            echo("メールが送信できませんでした。エラー:".$this->Cakemail->getErrorMessage());
        }
    }
}

使い方自体は PHPMailer と同じなので、難しくはないと思います。注意点としては本文をセットする setBody でVIEWファイルとLAYOUTファイルを指定してあげることと、$this->Cakemail->setType でHTMLメールかテキストメールか指定することです(デフォルトでテキストメールになっているので、HTMLメールを送るとき以外はコメントアウトでもOK)。

VIEWファイルとLAYOUTファイルの例

上記のコントローラを使って、VIEWファイルとLAYOUTファイルの例を出しておきます。

/app/views/elements/email/text/mailsend_view.thtml

メール送信します。
このファイル mailsend_view.thtml 自体の文字コードは UTF-8 で保存しています。

■hoge:<?php echo h($content['hoge']); ?>

■piyo:<?php echo h($content['piyo']); ?>

/app/views/layouts/email/text/mailsend_layout.thtml

<?php
    if($session->check('Message.flash')){
        $session->flash();
    }
    echo $content_for_layout;

これで添付ファイルもHTMLメールもテンプレートも簡単に使うことができるようになりました。

参照/参考サイト

Comments:4

satoru 2008年9月 4日 10:57

Cakemailを有り難く使わせて頂いております。

この記事での「送信方法」のコードに記述ミスかと思われる所を見つけたので、報告致します。

CCの設定をする「addCC」ですが、ソースコード内では「addCc」と記述されている事から「addCc」としたほうが良いかとおもいます。

両方で使用した所、
addCCで使用した場合、1つ目に設定したCCアドレスへは送信されましたが、2つ目以降のCCアドレスへは送信されませんでした。
addCcの場合は、設定した2つのCCアドレスへ問題なく送信されました。

複数のCCアドレスを設定される方は、つまづく所かと思いますので、修正されればと思います。

以上、長々と失礼しました。

zaru 2008年9月 4日 13:18

> satoru さん
使っていただきありがとうございます。
また、ご指摘もありがとうございます。修正しました。

aus 2009年1月23日 14:18

環境
cakephp 1.2系
apach 2.2
WinXP

この記事は問い合わせフォームを作成するのに大変役立ちました。

けれども下記のようなエラーメッセージがでてしまいます。

Undefined property: View::$webroot [CORE/cake/libs/view/view.php, line 742]

もしこの問題を解決されていたら返答をお願いします。

stare 2009年1月25日 23:29

欲しいと思っていたものがそのままあったので、非常に助かりました。

気がついたのですが、現行の1.2系だと35行目のrenderElementの次に
$body = $view->renderLayout($body,$this->setDir . DS . $this->setType . DS .$layout_name);
と追加で記述してやらないと、レイアウトファイルが有効にならないようでした。

問題ない使い方なのかわかりませんが、viewまで追いかけて悩んだ末、これでうまくいきました。

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://blog.tofu-kun.org/mt-tb.cgi/382
Listed below are links to weblogs that reference
CakePHPでメールを送信する from Webプログラマー+WebデザイナーなZARU日記

Home > CakePHP > CakePHPでメールを送信する

Profile

zaru

Name : zaru

Webプログラマ+Webデザイナで、Webディレクタやってます。Twitterやっているので、ぜひフォローしてやってくださいませ。Twitter - zaru。また、そのほかのプロフィールについては、iddy - zaruを見てください。

Search
Feeds
Others

Return to page top