CodeIgniterEmailクラス はそこそこ便利に使えるサーバーサイドメール送信用クラスなんだけど、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;
	}