MIME エンコードされた email の Subject をデコードする

メモしておかないと忘れそうなので。

# email.parser.Parser と email.header.decode_header をつかう
>>> from email.parser import Parser
>>> from email.header import decode_header

# テキストファイルで保存されている email を開き、パースする
>>> fp = open("foo.eml", "rb")
>>> parser = Parser()
>>> message = parser.parse(fp)
>>> fp.close()

# パース結果は email.message.Message オブジェクトになるようだ
>>> message
<email.message.Message instance at 0x00C71468>

# ヘッダー項目に添え字でアクセス可能らしい
>>> message['Subject']
'=?iso-2022-jp?B?GyRCQXc/LiVGJTklSBsoQiAbJEI3b0w+GyhC?='
>>> message['Date']
'Mon, 7 Feb 2011 11:42:25 +0900 (JST)'

# MIMEエンコードされている Subject をデコードするよ
>>> decode_header(message['Subject'])
[('\x1b$BAw?.%F%9%H\x1b(B \x1b$B7oL>\x1b(B', 'iso-2022-jp')]

# タプルのリストになっててわかりにくいのでいったん変数に入れる
>>> subject = decode_header(message['Subject'])[0][0]
>>> encoding = decode_header(message['Subject'])[0][1]

# デコードされてる
>>> subject
'\x1b$BAw?.%F%9%H\x1b(B \x1b$B7oL>\x1b(B'

# unicode文字列に変換してめでたしめでたし
>>> subject.decode(encoding)
u'\u9001\u4fe1\u30c6\u30b9\u30c8 \u4ef6\u540d'
>>> print subject.decode(encoding)
送信テスト 件名


see also: