数年来悩んでいた事象が解決したので、忘れないうちにここに書いておきます!というか、こんな事で数年も悩んでいたのか、馬鹿じゃない?と自分でも思う訳ですが、とにかく解決したのでここに書いておきます。

大量メール配信にpearのMail_Queueをずっと使ってきました。しかし、いつも本文が文字化けしてしまうのです。

mb_convert_variables(“JIS”, “auto”, $changed_honbun);
mb_convery_encoding(“JIS”, “auto”, $changed_honbun);

上記のどちらでも同じですが、とにかくこんな風に文字コードを変換し、

$body=$o_mime->get(array("head_charset" => "ISO-2022-JP","text_charset"=>"ISO-2022-JP","test_encoding"=>"ISO-2022-JP"));

とやって、queueにセットする訳ですがどういう訳かある特定の文字で化けたりしてしまっておりました。で、いくら調べても分からないので、ええーいということで、

<$body=$o_mime->get(array("head_charset" => "ISO-2022-JP","text_charset"=>"ISO-2022-JP","test_encoding"=>"ISO-2022-JP"));

という、荒技?(馬鹿丸出しとも言う)でなんとテキスト自体をencodeしてしまうという暴挙に出ておりました。この方法でほとんどのメールアドレス(gmailなど)では受信出来るのですが、あまりエレガントではありません。また、outlook.comではこれが解釈出来ずに本文がちゃんと表示されなかったりと、100%完璧な方法ではありませんでした。

で、解決したのがこの記事を拝見させていただいてからでした。PEAR Mail/Queue 本文が文字化けする

$mail_queue->put($from, $to, $headers, addslashes($mime->get()));

ということで、queueにセットする際にエスケープ処理しなさいということでした。。。ええーーー。どうやらheader部分はエスケープ処理が入っているみたいなんですが、setTXTBody()はエスケープ処理が入っていないということで。。。普通両方入れとくよな。。。

でも、この記事のおかげで命が救われました。。ありがとう。。あ、でもaddslashesじゃいろいろと問題があるみたいなので、mysql_real_escape_string()みたいな他の方法を使ってくれという事です。

ちなみに、SQLインジェクション対策こちらにいろいろと書いてあります。完璧を求めるとどの方法も100%ではないみたいですが。。

では