CodeIgniter の Emailクラス はそこそこ便利に使えるサーバーサイドメール送信用クラスなんだけど、subject にちょい長めの日本語を渡すと見事に文字化けしてくれたりする。
subject()関数内部で呼んでいる_prep_q_encoding()が微妙なエンコーディングをしてるのが原因なのだが、PHPでは mb_encode_mimeheader っていう便利なエンコード関数が別途存在しているため、これを使ってエンコードした文字列をそのまま渡したい。エンコードしたASCII状態のものを渡せばOKなんじゃないの?とおもいきや、これまた内部処理が邪魔してくれていたりする。
ってことで system/libraries/Email.php をちょっと改造。
_prep_q_encoding()に手をつけるのはBadな解決策なのでヘタレな回避で。
Before:
public function subject($subject) { $subject = $this->_prep_q_encoding($subject); $this->_set_header('Subject', $subject); return $this; }
After:
public function subject($subject, $encoding = TRUE) { if ($encoding) $subject = $this->_prep_q_encoding($subject); $this->_set_header('Subject', $subject); return $this; }