LoginSignup
10
12

More than 5 years have passed since last update.

Thunderbirdで受信したメールの添付ファイルをPythonで抜き取る

Posted at

前にメールに添付された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ファイルを保存するだけでなく、圧縮されたログファイルを読み込み、適当な処理をすることもできるが、ちょっと混みいったソースコードになったので、コメント等で要望があれば書き足すことにする。

10
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12