メールを記録していると、Subject欄が、 Subject: =?ISO-2022-JP?B?PHN0cm9uZz4bJEIlRiU5JUgbKEI8?= などと人間が読めないような場合があります。
これはMIMEヘッダフィールド用にエンコードされているからです。
この記事では、PHPでMIMEヘッダフィールドをデコードする方法と、公開しているウェブツールを紹介します。
MIMEヘッダフィールドのデコード方法
デコードに使えるPHP関数
iconv_mime_decode を使います。
使い方
1 |
string iconv_mime_decode( string encoded, int mode, string charset); |
引数
encoded: MIMEヘッダエンコードされた文字列
mode: 関数の動作を定義。0で問題ないです。
値 | 定数 | 意味 |
1 | ICONV_MIME_DECODE_STRICT | RFC2047に完全準拠する形式でデコードします。デフォルトで無効。実際は間違ったMIMEヘッダも多いため、OFFが良いです。 |
2 | ICONV_MIME_DECODE_CONTINUE_ON_ERROR |
iconv_mime_decode_headers()関数でこの定数を指定すると、文法的なエラーを無視してデコードを継続。 |
charset: 結果文字列の文字コードを指定。指定しなかったときは、iconv.internal_charsetが使用されます。
戻り値
成功したらデコードされたMIMEフィールドの文字列を返答します。
エラー発生したら、false を返します。
デコードするウェブページの例
iconv_mime_decodeを使ったデコードの例として、ウェブページのフォームにMIMEヘッダ用にエンコードされた文字列を入力したら、デコードした結果を表示するウェブページの例を紹介します。
サンプルコード
以下のコードを、 mime_decoder.php として保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?php if (isset($_POST["str_pre"]) && strcmp($_POST["str_pre"],"")!=0 ) { //変換対象文字列あり $str_pre = $_POST["str_pre"]; } else { $str_pre = ""; } ?> <html lang="ja"> <head> <meta charset="UTF-8"> <title>メールMIMEヘッダ デコード</title> </head> <body> <h1>メールMIMEヘッダ デコード</h1> <h2>対象文字列</h2> <form id="frm1" name="frm1" action="/mime_decoder.php" method="POST"> <textarea name="str_pre" rows="5" cols="80"><?php echo $str_pre;?></textarea> <p><input type="submit" name="sub_frm1" value="変換"></p> <?php if (strcmp($str_pre,"")!=0): ?> <p>変換しました</p> <h2>デコード後文字列</h2> <textarea readonly name="str_post" rows="5" cols="80"><?php echo iconv_mime_decode($str_pre, 0, "UTF-8"); ?></textarea> <?php endif; ?> </form> </body> </html> |
動作例
ブラウザで開くと、下図のようにテキスト入力と「変換」ボタンがついたフォームが表示されます。
対象文字列に MIMEヘッダ用にエンコードされた文字列を入力し、「変換」を押すと変換結果が表示されます。
例えば、
1 2 |
Subject: =?ISO-2022-JP?B?GyRCJUYlOSVIJWEhPCVrJEsbKEI=?= =?ISO-2022-JP?B?GyRCJEQkJCRGGyhC?= |
と入力して、「変換」ボタンを押すと、下図のように結果が表示されます。
※ローカル環境でウェブページの開発環境の構築方法は、
記事「Windowsにウェブ開発環境を入れよう:MySQL付きXAMPPのインストール手順」、「Windows10にXAMPPでサーバー開発。複数のウェブサイトのテスト方法」などで紹介しています。
サンプルコードの解説
・POSTデータの取得
フォームで「変換」ボタンを押した場合、POSTで「str_pre」キーに変換対象の文字列がブラウザから送られてきます。この部分では、「str_pre」キーが存在して、何かしら文字列が入力されていたら、 $str_pre に入力しています。
・フォーム前半
フォームの定義です。ボタンが押されたとき、同じファイルである「mime_decoder.php」に、POSTでデータ送信をするよう設定しています。
textareaはテキストボックスで、$str_pre を表示しています。
・フォーム後半
$str_pre に何かしら文字が入っていた時だけ、28-31行を表示します。
テキストボックスは、読み出し専用に設定し、iconv_mime_decode 関数を使って、$str_pre 文字列をデコードした結果を表示しています。
MIMEヘッダのデコーダを公開
この記事で紹介したMIMEヘッダのデコーダのウェブページを公開しています。
さくっと、変換だけできればよい人は、アクセスして使ってみてください。
まとめ
メールのヘッダ情報を確認したとき、Subjectだけ文字化けしている場合に、MIMEヘッダエンコードされている場合があります。
この記事では、PHPを使ってMIMEヘッダのデコードする方法を紹介しました。
また、デコードツールを公開してURLを紹介しました。
Subjectが読めず困っている人は、ぜひ、利用してみてください。
コメント