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が出てたけど、何が変わったのかな?
リファレンス本の改訂版をそろそろ出してほしいところ。

スポンサーリンク
管理人

システムえんじにゃー🐈
趣味はエレキギターなど。作曲したい。
WoWs/プリコネ
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする
surface0 (さーふぇす)をフォローする
Rain or Shine

コメント

  1. […] ます。)   [CakePHP] Emailコンポーネントで文字コードを変換して送信する http://www.rainorshine.asia/2010/05/09/post1747.html   CakePHP EmailComponent を使う時の注意 http://d.hatena.ne.jp/foldrr/20090623/12456872 […]

タイトルとURLをコピーしました