ようこそゲストさん

CPA-LABテクニカル

メッセージ欄

分類 【cakephp】 で検索

一覧で表示する

2008/07/02(水) CakePHP(RC1.2)のemailコンポーネントで日本語はまだ厳しい

はてブ情報 はてブに登録 はてブ数 cakephpspok

CakePHP(1.2RC2)のemailコンポーネント評価

CakePHP 1.2 RC2 がリリースされたので、新しいemailコンポーネントを評価してみた。全般的に言えば、改行コード&英文周りはかなり改善されており、英語メールを送る分には、大丈夫かと思う。
しかし、一部でマルチバイト非対応となっており、日本語の場合、若干の問題点がある。
  1. Content-Transfer-Encoding:ヘッダーは7bit固定&charsetはutf-8なので、charsetをiso-2022-jpに変更し、本文、ビュー、レイアウトのすべてを自前でiso-2022-jpに変換する必要がある。*1
  2. ワードラップ処理がマルチバイト非対応
    __wrapメソッドがマルチバイト非対応なので、文字化けする可能性が大きい。また、「日本語文字列のバイト数取得にstrlenだけではダメな理由-PHP」でも述べたとおり、マルチバイト環境では、文字列のバイト数を得るのに、strlenだけを使うのは、問題がある。
  3. MIMEエンコードが、マルチバイト文字の途中で強制改行される可能性のあるスクリプトとなっており、長いsubject&Gmailやbeckeyでタイトルが文字化けする可能性が大きい。*2
  4. qmail用がデフォルト?
    mail関数で送る際には、MTAがqmailであればLF,qmail以外のsendmailやPostFixであれば、CRLFである必要があるが、LFがデフォルトとなっている。
    これはこれで賢いやり方で、CRLFをデフォルトにするとqmailの時にエラーがでるけれど、LFがデフォルトであれば、sendmailやPostFixがエラーを出すことはないだろうからだ。
  5. SMTP送信の場合、 名前<address@example.com> の形式が使えず、<address@example.com> というメールアドレスのみのヘッダーとなる。
    う~ん。どうしてこうしたのでしょうかね。

その他の制約

  • 本文base64エンコードできない。
  • Quoted-Printable非対応
  • デコメ送信不可能*3
  • MHTL(インラインHTML)メール不可
  • 添付ファイルの日本語不可

全般的な感想

相当がんばれば、デフォルトでも日本語は送れないことはないと思うけど、メールひとつ送るのに、がんばりたくないでしょ。

う~ん。mb_send_mail単体のほうがましかな。

Qdmailなら。。。。

高機能マルチバイトメールライブラリQdmailなら、CakePHPのコンポーネントとしても動作します。
上記のemailコンポーネントの弱点はすべて克服されておりますので、一度お試し下さい。

*1 : 7bitなのに、8bitコードのUTF-8をデフォルトにするのはよくないです。。。

*2 : 私もハマったところ

*3 : これは仕方ないよね

2008/05/15(木) CakePHPコントローラーをメール受信をきっかけに起動する

はてブ情報 はてブに登録 はてブ数 cakephpspok

.mailfilterの設定

まず、.mailfilterに以下のように記述する。
mailfilterについては、さくらインターネットでメール受信をリアルタイムに処理する、を参照。

ここでは、receivers_contoroller.php に記述された ReceiversContorollerを起動することを意図してみよう。
cc "| /usr/local/php-5.2.6/bin/php-cgi -q /home/user_name/hogehoge/app/webroot/index.php url=receivers/index"
サーバーにメールを残す必要がない場合は、cc を to に変更する。
注意点 パラメーターの渡し方
urlのパラメーターは、次のように'?'を使用して記述した場合には失敗する。
index.php?url=receivers/index
次のように、index.phpとurl=の間には、半角空白を挟んで指定する。
index.php url=receivers/index
なお、
/usr/local/php-5.2.6/bin/php-cgi
は起動するPHPの本体プログラムの指定である。これについては、さくらインターネットでメール受信をリアルタイムに処理する を参照のこと。
-q は、httpヘッダーを出力しないようにする設定である。

次に、receivers_contoroller.php に記述された ReceiversContorollerを起動してみよう。
<?php

class ReceiversController extends AppController{

    var $uses = null;

    function index(){

        $fp=fopen("php://stdin",'r');
        $content = null;
        while( !feof( $fp ) ){
           $content .= fgets( $fp , 4096 );
        }
        fclose( $fp );

        $this->render('void','void');
    }
}
?>
これで、$contentにメールの中身が入ることになる。あとは自由に料理しよう。
ここで、メールの中身とは、いわゆる本文のことではなく、メールヘッダーも含めたメール全体のことを示すことに留意すること。
Pear::MIMEでも解析できるが、簡単なものであれば、preg_matchで十分だろう。
また、いずれPearを使用しない方式でのメールデコードを紹介したい。

なお
        $this->render('void','void');
としたのは、メール起動の場合、画面出力は意味がないからである。
しかるべき場所に、layoutのvoid.ctp、viewのvoid.ctpを何も記述しない空ファイルとして配置しておこう。(CakePHP1.1の場合は、void.thtmlとなる。)

*1 : perlの話ですが、参考になるはずです。

Qdmailと組み合わせて空メール処理をCakePHPのコントローラーで処理する

recevers_controller.phpを以下のようにする。*2
<?php

class ReceiversController extends AppController{

  var $uses = null;
  var $components = array('Qdmail');

  function index(){

    $fp=fopen("php://stdin",'r');
    $content=null;
    while( !feof($fp) ){
      $content .= fgets($fp,4096);
    }
    fclose($fp);

    $header = preg_split( '/\r?\n\r?\n/is' , $content );

    if( 0 !== preg_match('/from:\s*<?([^<>@ ]+@[^<>@ ]+)>?[^<>@\r\n\s,]*\r?\n/is',$header[0],$matches)){

    //---------------------------
    // 本来はその他にも、携帯端末からの
     // メールであることを確かめる
     // ルーチンを置いたほうがよい。
     // いたずら、迷惑メールの発信元に
     // ならないようにするためである。
     // mail address varidationも必要だろう
     //--------------------------

    $to = str_replace( array("\r","\n") , '' , $matches[1] );
    $this->Qdmail->to($to);
    $this->Qdmail->from('from@example.com');
    $this->Qdmail->subject('空メールのテストです。');
    $this->Qdmail->cakeText( $to ,  'index' , 'default' );
    $this->Qdmail->send();
    }
    $this->render('void','void');
  }
}
?>
view,layoutの置き場は、QdmailをCakePHPで使うをご参照下さい。

以下のQRコードを読み取って、空メールを送ってみて下さい。
上記のコードでもって実現した*3返信メールをお送りします。
qr_caketest.png
(あえてメールアドレスは書いていません。)
貴方のメールアドレスは保存しないのでご安心ください。信用できない方はメールを送らないでください。

*2 : セキュリティは自己責任で

*3 : 実際にはもう少し手が入っている

1: 開発者 『この方法だと、さくらでPHPのバージョンアップがあると、PHPの実行パスが変わってしまうため、その度に修正しなければならなくなり...』 (2009/12/22 10:56)

  • CakePHPのシェルコマンドをさくらインターネットで使う CPA-LABテクニカル spok
    メール受信をきっかけにCakePHPコントローラーを起動する では、その名の通り、コントローラーをメール受信で起動させた。ここでは、CakePHP1.2で導入されたシェル機能(shell)を利用し、CakePHPのシェルをメール受信をきっかけに起動させてみ...

2008/05/01(木) さくらインターネットでCakePHPコンソール

はてブ情報 はてブに登録 はてブ数 cakephpspok
CakePHP1.2のconsole機能については、マニュアルにこう書いています。
[http://manual.cakephp.org/ja/view/108/the-cakephp-console:http://manual.cakephp.org/ja/view/108/the-cakephp-console]
$ ./cake/console/cake
で、起動するはずです。
cakeという拡張子もなにもついていないファイルですが、これはunix系OSのシェルスクリプトになります。
しかし

続きを読む

1: HY 『有益な情報ありがとうございます! 超グレートっす。「cakephp bash console」で検索したら1番上に出てきて、 欲...』 (2008/09/22 18:00)

  • CakePHPのシェルコマンドをさくらインターネットで使う CPA-LABテクニカル spok
    メール受信をきっかけにCakePHPコントローラーを起動する では、その名の通り、コントローラーをメール受信で起動させた。ここでは、CakePHP1.2で導入されたシェル機能(shell)を利用し、CakePHPのシェルをメール受信をきっかけに起動させてみ...