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 の範囲外の文字が使われていた時の対処もしたいのだが、やり方がわからない