前にメールに添付されたPDFをテキスト形式にするという投稿をしたら、割と人気があったようで、これを
- procmail/fetchmailを使わず、Thunderbirdを使う
- 添付されたPDFではなくZipファイルを扱う
という改造をしたバージョンについて書く。
18.4. mailbox — 様々な形式のメールボックス操作に
十分な注意を、何か他のプロセスによっても同時に変更される可能性のあるメールボックスを更新する時は、払わなければなりません。そのようなタスクをこなすのに最も安全なメールボックス形式は Maildir で、 mbox のような単一ファイルの形式を並行した書き込みに利用するのは避けるように努力しましょう。
とか
mbox 形式には幾つかのバリエーションがあり、それぞれオリジナルの形式にあった欠点を克服すると主張しています。
みたいに書いてあったので、メールに添付されたPDFを...ではCygwinのprocmail/fetchmailでMaildir形式として読み込んでいたが、Thunderbirdで扱われているmbox形式は(多少の方言はあるにしても)Pythonのmailboxライブラリで読めるので、Python.orgの公式バイナリを使っている。
Thunderbidrはメールを保存するディレクトリは、ランダムな8文字で生成されるので、そのあたりを書き換える必要がある。
# coding:utf-8
import os
import os.path
import sys
import email
import mailbox
import mimetypes
maildir =
'C:\\Users\\t.uehara\\AppData\\Roaming\\Thunderbird\\Profiles\\abcdef12.default\\Mail\\pop.example.com\\Inbox'
tempdir = 'C:\\Users\\t.uehara\\Downloads\\'
def extractMime(message):
for part in message.walk():
if part.get_content_maintype() == 'multipart':
continue
fname = part.get_filename()
if fname != None:
if fname.find(".zip") != -1:
zipname = tempdir+fname
# Zipファイルが存在する場合は処理を飛ばす
if os.path.isfile(zipname) == False:
fp = open(zipname, 'wb')
fp.write(part.get_payload(decode=True))
fp.close()
print zipname
if __name__ == '__main__':
for message in mailbox.mbox(maildir):
extractMime(message)
Zipファイルを保存するだけでなく、圧縮されたログファイルを読み込み、適当な処理をすることもできるが、ちょっと混みいったソースコードになったので、コメント等で要望があれば書き足すことにする。