0

これはSOで広くカバーされているので、前もってお詫び申し上げます...しかし、投稿を調べたところ、これを機能させることができません。

目標 gmail
から特定の条件に一致するメールを取得し、添付ファイルを保存してから削除したい。

問題
だから、メールを削除することを除いて、すべてを機能させることができます。いくつか削除すると、次のエラーが発生します。

トレースバック (最新の呼び出しが最後): ファイル "get_overdues.py"、22 行目、email_body = data[0][1] の TypeError: 'NoneType' オブジェクトは添え字にできません

実行するたびに、さらに多くのメールが削除され、同じエラーで終了します。これは cronjob で実行する必要があり、babysat にすることはできません。

私は何を間違っていますか?

m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user,word)
m.select("INBOX")

searchString = "(SUBJECT \"Daily Mail Notices\")"

resp, items = m.search(None,searchString)
items = items[0].split()

for emailid in items:
    print emailid
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    mail = email.message_from_string(email_body)

    if mail.get_content_maintype() != 'multipart':
        continue

    print "["+mail["From"]+"] :" + mail["Subject"] + mail["Date"]

    sub_dir = re.sub('[,:\- ]','', mail["Date"])

    for part in mail.walk():
        if part.get_content_maintype() == 'multipart':
            continue

        if part.get('Content-Disposition') is None:
            continue

        message_dir = os.path.join(dump_dir, sub_dir)

        if not os.path.exists(message_dir):
            os.makedirs(message_dir)

        filename = part.get_filename()

        counter = 1 
        if not filename:
            filename = 'overdues-%s' % counter
            counter += 1

        att_path = os.path.join(dump_dir, message_dir, filename)

        if not os.path.isfile(att_path) :
            fp = open(att_path, 'wb')
            fp.write(part.get_payload(decode=True))
            fp.close()

    m.store(emailid, '+FLAGS', r'(\Deleted)')
    m.expunge()

m.close()
m.logout()
4

1 に答える 1

2

あなたの問題は明らかに次のfetchとおりです。

resp, data = m.fetch(emailid, "(RFC822)")
email_body = data[0][1]

dataまたは、可能性は低いですが、のいずれかに対して NoneType を返していますがdata[0]None明らかに添え字を付けることはできません。の結果を再確認して、m.fetch期待どおりの形式になっているかどうかを確認することをお勧めします。

これはおそらく、このメールが削除された (消去されていない) ためです。

于 2012-06-08T22:13:33.380 に答える