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が出てたけど、何が変わったのかな?
リファレンス本の改訂版をそろそろ出してほしいところ。
コメント
[…] ます。) [CakePHP] Emailコンポーネントで文字コードを変換して送信する http://www.rainorshine.asia/2010/05/09/post1747.html CakePHP EmailComponent を使う時の注意 http://d.hatena.ne.jp/foldrr/20090623/12456872 […]