Outlook からの文字化けメール

Python でメールを処理しているのだが、Outlook からのメールの一部が文字化けするので困っていたが、一応の解決法が見つかったので対策法を記載しておく

対応したのは日本語なのに中国語扱いで送られて文字化けするメール

import email with open('mail-file.txt', 'rb') as fp: msg = email.message_from_binary_file(fp) charset = msg.get_content_charset('utf-8').lower() encoding = msg.get('Content-Transfer-Encoding') if charset == 'gb2312': charset = 'gb18030' if encoding == '8bit': # utf-8 print(msg.get_payload()) else: print(msg.get_payload(decode=True).decode(charset, 'ignore')) # デコードの失敗した時の処理追加

この手のメールの問題発生原因は複数要因が重なっているため

  • メール作成者は日本語として作成しているであろうに、誤って中国語判定されメールの charset が gb2312 となる
  • しかし実際に使われているのは、より上位の集合である GBK、もしくは更に上位の GB1800 が用いられている模様
  • Python の get_payload() 指定された charset で素直にデコードする

その為 GB2312 として送られてきた場合は、完全に上位互換である GB18030 扱いとし、後は 8 bit (UTF-8 でデコード不要) と 7 bit を分けて処理してやれば文字化けはなくなる

もちろん添付ファイルが付いていたり、暗号化メールの場合はその処理が別途必要になる

なお本当は Outlook からか否かに関わらず、iso-2022-jp で送られているのにローマ数字Ⅰなどの iso-2022-jp の範囲外の文字が使われていた時の対処もしたいのだが、やり方がわからない