メールの文字コードはISO-2022-JPにしたい。
というわけで、あれこれした結果です。CakePHPのEmailコンポーネントを使って、文字コードISO-2022-JPのメールを送る際に以下のようにすると文字化けせずに送信出来ました。
$this->Email->to = '受信先<naoto5959@example.com>';
$this->Email->bcc = array('naoto5959@example.com');
$this->Email->replayTo = '返信先<naoto5959@example.com>';
$this->Email->from = '送信元<naoto5959@example.com>';
$this->Email->subject = 'メールのタイトル';
$this->Email->charset = 'ISO-2022-JP';
$this->Email->sendAs = 'text'; // html形式にしたい場合はhtmlに
$this->Email->lineLength = 1000; // 長いURLを改行しないようにする
$this->Email->template = 'hoge'; // elements/email/text/hoge.ctp
$this->Email->set('hoge', $hoge); // viewに渡す変数
// templateを使ってレンダリングされた結果を取得する
$message = $this->Email->__wrap(null);
$message = $this->Email->__renderTemplate($message);
$this->Email->template = null;
$message = mb_convert_encoding(implode("\r\n", $message), 'JIS');
$this->Email->send($message);
$this->Email->reset();
以下、はまった点。
subjectはmb_convert_encodingすると、かえって文字化けしてしまう。
ソースを読んでみると、charsetで指定したエンコードに変換する処理があるので、自分出わざわざ変換する必要はないみたいです。
lineLengthを指定しないと長いURLが改行されてしまう。
長いURLを改行するのは、RFC2822的には78文字で改行してねなので実は正しいです。ただ、お客さん的には改行しちゃだめよ、というお話にもなりがちなので難しいところなのですけど。
というわけで、ISO-2022-JPでメール送信出来るようになりました。良かった良かった。