[CakePHP] Emailコンポーネントで文字コードを変換して送信する

  • このエントリーをはてなブックマークに追加

CakePHP1.2.6にて。
標準で組み込まれているEmailコンポーネントはいろいろ便利ですが、文字コード(charaset)のデフォルトがUTF-8になっています。近年のメーラーはほとんどがUnicode対応なのですが、未だUTF-8で送ると日本語が文字化けしてしまうものがあるようです。そこで文字化けを防ごうとcharasetプロパティに『iso-2022-jp』を設定しても、自動で文字コードを変換してくれません。どうにかせにゃと思ったのでメモ。

まともにやろうとすると、メール用のレイアウトとテンプレートのパスを生成して、そいつを使ってレンダリングした結果を取得したら文字コード変換して、etc…と面倒なことになり、せっかくのEmailコンポーネントの手軽さを生かせなくなってしまいます。

そこでもっとも手っ取り早いと思われる方法としてEmailコンポーネントを継承する方法を提案。
下記のコードを記述したファイルをEmailExコンポーネントとしてapp/controller/components/email_ex.phpに保存します。おそらくこの2つのメソッドをオーバーライドするだけで大丈夫かと・・・

<?php
App::import('Component', 'Email');
class EmailExComponent extends EmailComponent {
    function __formatMessage($message) {
        mb_convert_variables($this->charset, Configure::read('App.encoding'), $message);
        return parent::__formatMessage($message);
    }

    function __renderTemplate($content) {
        $msg = parent::__renderTemplate($content);
        mb_convert_variables($this->charset, Configure::read('App.encoding'), $msg);
        return $msg;
    }
}

そしたらコンポーネントを使うコントローラのcomponentsプロパティにEmailExを加えます。
で、次のようにcharsetを指定すればよし。あとは通常通りにメール送信の手続きをします。

$this->EmailEx->charset = "ISO-2022-JP";

多分クラスを継承するほかにも、cake/lib/controller/components/email.phpをapp/controller/components/email.phpにコピーして、sendメソッドに変換処理を噛ませるだけでもいけそうな気がします。

そういえばもう1.3stableが出てたけど、何が変わったのかな?
リファレンス本の改訂版をそろそろ出してほしいところ。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。




コメント

コメントを残す