Outlookからのメール文字化け
メーラにMicrosoft Office Outlook 12.0を使用されている方からのメールが届くのだが、このメール本文冒頭に
^B1^Bj^BM MIME ^L`^N.^BL^C}^C^K^C`^Cp^A[^Cg ^C^A^Cb^CZ^A[^CW^BE^B7^AB
のような一文(^Bなどのハット付きの箇所は0x02などのバイナリデータ)があり、このせいだと思うのだが自前で使っているメーラで漢字コードを誤認識して文字化けとなってしまう場合がある。また、単にINBOXメールファイルをjlessなどで眺める場合にも、表示開始位置によっては文字化けが発生する。
MIMEの語が見えるんでおそらくそれを表しているんだろう。他のメーラからの送信の場合は
This is a multi-part message in MIME format.
と単にアスキーコードで書いててくれるんだが、上のやつはシフトJISか何かなんかなぁ…。
検索してもあまり情報がないのだが、これについて検証しているページがあった:
どうやら「これは MIME 形式のマルチパート メッセージです。」とシフトJISで書かれた文の8ビット目のデータが落ちたものだとか。
文字コードデータの復旧用のコマンドとして、rjis というのが見つかっていた:
これには、文字コードに応じてrjis,rsjis,rujisなどの復旧コマンドがあるが、他にdejisというESCを落とすコマンドも含まれていて、これを使うと確かに「これは」が「^B1^Bj^BM」となっていた。まったくもって迷惑なM$品質…(google検索)。
- なぜOutlook 2007がダメなのか – アクセンスのおまけ – Trac
- Outlook 2007のすごい仕様 – まさおのChangeLogメモ / 2007-06-07
- Outlook 2007 マルチパート – Mimori’s Algorithms tDiary(2007-12-25)
- Outlook のダメさ – Diary: June 2008(middle)
今回文字化けしてしまったデータは、INBOX中の該当メールの箇所だけでなく、以降のメールまですべて影響が生じてしまった。本文を見るとJISデータの漢字イン「ESC $ B」が「ESC , A」に置き変わって(?)しまっていたようで、また、すべての行が文頭「ESC , A」で文末は漢字アウト「ESC ( B」で囲まれてしまっていた。いちおう「ESC , A」を漢字インに置き換えるとだいたいの漢字の認識はできるのだが、漢字部とアスキー部の区別がなく一緒くたになっているので、アスキー文字以降は文字化けのままとなってしまっていた。しょうがないので、Windows側にデータを送り、xyzzy でファイルをバイナリモードで開いて、正規表現でメールヘッダっぽいところは一括で「ESC , A」「ESC ( B」を省き、添付アスキーデータやquoted-printableの箇所は、query-replace-regexpで省いていった。本文が問題だが、もうひとつxyzzyを開いて編集中のファイルを文字コード自動認識で開いて、そこで文字化けしている箇所を探し、バイナリ編集側で漢字インと漢字アウトの位置を調整して、アスキーデータの表示もできるようにした。(文字化けしてからのメール数がさほどなかったのが救い…)。
今後だが、.forwardにこのバイナリ文字列が見つかったら「This is a multi-part message in MIME format.」と置き換えるよう設定してみるか(perlでのバイナリ置換ってこれでいいんだっけ?)。
mime-bodyhead-fix.pl
#!/bin/perl while(<>) { s/^\x021\x02j\x02M MIME \x0c`\x0e.\x02L\x03}\x03\x0b\x03`\x03p\x01\[\x03g \x03\x01\x03b\x03Z\x01\[\x03W\x02E\x027\x01B$/This is a multi-part in MIME format./'; print; }