文字化けの原因の解消!!!

 

中の人やりました!! メール投稿の文字化けの原因を突き止めました!!

とりあえず、ptstへの投稿

○○@post.timelog.jp (○○はユーザーによって異なるランダムな文字や数字列)

のpostの部分をptstに変え、

○○@ptst.timelog.jp

で、文字化け解消投稿テストを行えます! これで問題なければ本番運用します!

ですので、画像添付あり、なしも含め、ptstへ様々な環境から送信し、テストしてまた報告ください!!

グループ投稿も試してみてください。

問題があれば修正します! (postは未対応なので、ptstのみでテストしてください。)

 

以下技術的考察です。

とっても苦労しました。

まず、ISO-2022-JPで送られたメールは問題なく、UTF-8で送られたメールは文字化けします。

まず、メールの文字コードの取得。これは、PEARのmimeDecode.phpで

$structure->ctype_parameters[‘charset’];

で取得できま・・・す・・・。

 

しかし!!

 

上記コードで取得できるのは、シングルパートの場合だけ!! マルチパートの場合は空が返されるのです!! もうこれはバグではないか・・・。

仕方ないので、strposで”charset=UTF-8″文字列を検索するという苦肉の策。。。こんなんでいいのか

 

文字コードが判明したら、UTF8の場合に、単純に、 mb_convert_encodingで文字コードを変換してみましたが文字化けしたまま。

よく調べてみると、これ、文字コードの他、エンコードの問題があったんです。UTF-8で送られたメールは、なんと、メール本文もbase64でエンコードされているのです!!base64というと添付メールだけかと思ってましたが、UTF-8で送信されたものに限って、本文もエンコードされているのです。

PEARのmimeDecode.phpで、本文だけ取り出すのは簡単です。メールの構造は、

ヘッダ

本文

だけではなく、

ヘッダ

マルチパート・本文

マルチパート・添付ファイル

という構造の二種類あります。なので、本文を取り出すときは、シングルパート・マルチパートに処理を分けて、それぞれで本文を取り出す必要があります。マルチパートには、本文がないからです。

 

さて、本文を取り出し、base64をデコード。ここまではよかった。

PEARのmimeDecode.phpでヘッダとマルチパートを取り出し、くっつけたら完成・・・になるはずが、PEARのmimeDecode.phpで取り出すと、ヘッダそのままではなく、toやfrom、subjectなど項目単位でしか取り出せないのです。これでは、元のメールが再構築できません。

添付ファイルも同じです。純粋に添付ファイル部分だけが取り出されるので、マルチパート部分のヘッダなどは復元されないんです。

 

困った。

 

と思って思いついたのが、str_replaceで本文だけを入れ替えるという方法。これでうまくいく!!とおもいきや。うまくいきません。

原因を探ると、デコード後、文字コードをmb_convert_encodingでUTF-8からISO-2022-JPへ変換する必要がありました。先に文字コードの変換をしてしまうと、デコードがうまくいかないようです。

 

こうやって無事、デコード済みの本文を、元の文の本文と入れ替えて完成・・・

 

ではありません。このままでもまだうまくいきません。

 

ヘッダの

Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

も、

Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

に変えておかなければだめでした。

 

ここまで偽装して初めて、全ての文字コードの変換およびデコードが完了、無事動いた、というわけです。

 

ああ苦労した・・・

 

※ここまで何度もメールのソースを読んだのは初めてでした

  • このエントリーをはてなブックマークに追加
  • Pocket

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。