蝸牛の歩み

蝸牛の如く,ゆっくりでも着実に前へ・・・

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');
だけを統一して使うのがいいみたいですし、(後略)