3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(cakePHP)Qdmailを使った日本語メール送信

以前にフレームワークを使わないPHPで日本語を送る方法を書きました。
cakePHPにはフレームワークなんだから、メールくらい簡単に遅れるだろうと思ってましたが、どうやら標準のメール送信ライブラリではmail関数を使っているため日本語メールが送れないみたいです。

前と同じように mb_send_mail で送信しようかとも思いつつ、ググって見つけたのが Qdmail です。

非常に高機能かつ使いやすいライブラリで、様々なフレームワークに対応してますし、フレームワークがない環境でも動くように作られています。で、国産というのも魅力です。

こちらが公式ページになります。 http://hal456.net/qdmail/
使い方はこちらに載せられてますが、Qdmailで日本語のメール送信こちらを参考にさせてもらい導入してみました。。

ダウンロード後、qdmail.php を app/controllers/components/ 配下に配置します。

下記が使用例です。
メールのようのテキストテンプレートファイルを用意して指定された文字列を置換するような仕組みにしてます。(これもcakePHP使ってるならもっといい方法があるんでしょうけど。。。)

class MailsController extends AppController{
    var $name = "Mails";
    //どのコンポーネントを使うか定義

    var $components = array('Qdmail');
    
    /*
     * 他のメソッドは省略
     */
 
    /*
     * メール送信用プライベートメソッド
     */
    function _sendMail(){

 
        //リセット
        $this->Qdmail->reset();
        //送信先指定
        $this->Qdmail->to('yyy@xxxx.jp', 'お客様');
        //送信元指定

        $this->Qdmail->from('ddd@eee.jp', 'ネットショップ○○');
        //件名指定
        $this->Qdmail->subject('ご注文確認');

 
        //メール本文テンプレート読み込み 
        $mailBody = file_get_contents("テンプレートファイル名");
 
        ////テンプレートに置換するデータ生成
        //現在日時曜日取得

        $array_week = array("日","月","火","水","木","金","土");
        $week = $array_week[date("w")];
        $date = date("Y/m/d H:i:s"). " " .$week ;
        //製品情報

        $where = array( "id"  => $this->params['form']['product'] , "prd_del" => "0" );
        $product = $this->Product->find( $where );  //指定されたidのデータをDBから抽出

        //都道府県
        $where = array( "id" => $this->Member->data['Member']['pref_id'] );
        $pref = $this->Pref->find( $where );  //指定されたidのデータをDBから抽出

        //ダイレクトメールをビューにセット
        if ( $this->Member->data['Member']['mem_dmail'] == 0){

            $dmail = '希望する';
        }else{
            $dmail = '希望しない';
        }
        //職種アンケート(DBから入力されたIDの値抽出)

        $btype = $this->Businesstype->find( array("id"=>$this->Order->data['Member']['businesstypes_id'],"btyp_del" => "0" ));
        //認知媒体アンケート(DBから入力されたIDの値抽出)

        $know = $this->Know->find( array("id"=>$this->Order->data['Order']['know_id'] ,"know_del" => "0" ) ); 
        
        //送信データと置換対象文字列定義。。

        $sendData = array(    "@date" => $date,
           "@order_product" => $product['Product']['name'] ,
           "@name" => $this->Member->data['Member']["name"],
           "@mail" => $this->Member->data['Member']["mail"],
           "@zip" => $this->Member->data['Member']['zip'] ,
           "@pref" => $pref['Pref']['name'],
           "@addr" => $this->Member->data['Member']["addr"],
           "@tel" => $this->Member->data['Member']["tel"],
           "@dmail" => $dmail ,
           "@ctgb" =>  $btype['Businesstype']['name'] ,
           "@know" => $know['Know']['name'],
        );
        //メール本文を置換。

        $mailBody = strtr($mailBody ,$sendData );
 
        //テキスト生成(?)
        $this->Qdmail->cakeText($mailBody );
        //cakePHP用にcakeTextというメソッドがあるらしいが、詳しい使い方が不明。。

        //$this->Qdmail->cakeText( $content , $template  , $layout  , $org_charset , $target_charset, $enc , iso-2022-jp )
 
        //送信
        $this->Qdmail->send();
    }

}

cakePHPのテンプレートファイルやレイアウトを指定して、もっと効率的にする方法(cakeText,cakeHtmlメソッド)があるようですが、ここら辺はまだ試してないので、普通に text メソッドで生成してます。
コントローラー内で一度ビューの内容をメモリ上に描画してそれの結果を変数に取得して送信する方法もあるようで、cakePHP メール送信はもうこれでいいでしょに書かれてました。