« bookmarkletの字数制限 Main 単数形のyou »

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検索)。

今回文字化けしてしまったデータは、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;
}