メールのタイトルを取得

poplibで取得したメールヘッダからタイトルだけを抜き出して列挙したかったのだが、emailパッケージの使い方がよくわからん。
リファレンスと格闘して何とか取れるようになったのだが、これでいいのだろうか。

# Python 2.6
import poplib
from email.parser import FeedParser
from email.header import decode_header

host = poplib.POP3('pop.mail.example.com')
host.user('foobar')
host.pass_('abrakadabra')
_, mailnums, _ = host.list()

for i in mailnums:
    num, _ = i.split(' ', 1)
    _, lines, _ = host.top(num, 0)
    fp = FeedParser()
    for j in lines:
        fp.feed(j)
        fp.feed('\n')
    mm = fp.close()
    buf = []
    for val, enc in decode_header(mm['Subject']):
        buf.append(val.decode(enc))
    print u''.join(buf)

host.quit()

メールの仕様やプロトコルの理解があやふやだと、リファレンスを読んでも使い方がよくわからないのだよ。

追記

charset is None for non-encoded parts of the header

http://docs.python.org/library/email.header.html?highlight=decode_header#email.header.decode_header

ヘッダのうちエンコードされていない部分のcharsetはNoneである

を忘れていたので修正。

for i in mailnums:
    num, _ = i.split(' ', 1)
    _, lines, _ = host.top(num, 0)
    fp = FeedParser()
    for j in lines:
        fp.feed(j)
        fp.feed('\n')
    mm = fp.close()
    buf = []
    for val, enc in decode_header(mm['Subject']):
        ## ここから
        if enc is None:
            enc = 'ascii'
        ## ここまでを追加
        buf.append(val.decode(enc))
    print u''.join(buf)