phpでメールを送るときのsubject
MOMOでは新着映像情報を毎月希望者にメールで送っている.しかし,そのsubjectが(一部メールソフトで)文字化けするという問題があった.文字化けと言っても,読めないわけではなく途中に「(B」という文字列が入ってしまう.いかにもJISコードのエスケープシーケンスだ.id:xnissy:20050831:p1でも書いたが,subjectが長いときに途中で改行されて,そのときおかしくなるらしい.このときはphpではエンコードせずに,Mew でエンコードした文字列を使ったのだが,今回は毎月subjectが変わるのであらかじめ用意するという手が使えない.
自力でエンコードするしかないのだろうと思って,それは大変そうだからと数ヶ月(このメールを送るようになったときからずっと)放置していたのだが,ちょっと調べてみたら実は簡単なことだった.
以前は
$headers['Subject'] = mb_encode_mimeheader(mb_convert_encoding($subject, "JIS"),"ISO-2022-JP");
のように,一旦mb_convert_encoding()でJISに変換した上でmb_encode_mimeheader()していた(これは別のスクリプトからぱくった).しかし,実はmb_convert_encoding()が文字コードの変換までやってくれるので,
$headers['Subject'] = mb_encode_mimeheader($subject,"ISO-2022-JP");
だけでよいのだった.
参考:
むしろ、文字列が長い場合の行の分割のときに
JISの制御コードを入れなければならないので、
内部でJISに変換しないといけないということでしょうね。
これでしたら、
mb_encode_mimeheader($str, 'ISO-2022-JP');
だけを統一して使うのがいいみたいですし、(後略)