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

カテゴリー: CakePHP   タグ:   この投稿のパーマリンク

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

  1. ピンバック: tenfrontier Lab » CakeEmailを使ったメール送信処理(基礎編)

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">