Tuesday, September 05, 2006

9/4 メールなど

・mb_send_mail()での件名文字化け
PHP 4.3.10 環境でメールの件名が文字化けする現象にブチ当たり
悪戦苦闘している。とりあえずイロイロと文献を漁ってみたので
現状分かってる内容をログっておくことにする。

文字化けするとはいっても、全角がすべて文字化けするわけじゃなく、
①とか﨑とか、いわゆる機種依存文字とか外字って言われる種類
の文字が化けるのが今回の内容。いくつかのパターンで、それぞれ
化け方が違った。詳細は以下。

・入力された件名をそのまま mb_send_mail に渡す
 →全角文字は普通に出力。①、﨑どっちも化け。

・件名を mb_encode_mimeheader で変換して渡す
 →「=?ISO-2022-JP?B?GyR・・・」みたいにすべてが文字化け。
  mb_send_mail は勝手にMIMEエンコードする仕様みたい
  だから、自前でエンコすると2重にかけることになるんで、
  この動きは正しい気もする。

・件名を mb_convert_encoding で JIS または ISO-2022-JP に変換して渡す
 →全角文字も①、﨑も正しく出力される!がしかし、
  10文字目以降が文字化け「123456789#0#1#2#・・・」
  これもいろいろ探ってみた感じだと、 mb_send_mail が件名を
  エンコードで失敗してるらしいことがわかった(B Encoding文字列は76文字を
  超えてはならない(RFC2047)ので長い日本語Subjectのメールを送るには
  日本語文字列を分割してそれぞれにB Encodingを施す必要がある)
  が、これがわかったところで、エンコード自体は mb_send_mail がやるから
  結局のところ打つ手無し・・・

というわけで、現状解決には至っていない。頑張って解消するとなると
mb_send_mail は捨てて、地道にエンコードロジックを書いて、mail 関数
を使う方法になるだろうけど、すげー面倒・・・。そもそも新しいバージョンの
mb_send_mail はこの問題が解消されてるかもしれないし・・・。
どうしようかな~?てゆーか、「件名に機種依存文字は使うな!それが
村の掟だっ!」と言ってしまうのがベストな気がしてきたな。

調査は続く・・・

No comments: