Python:'NoneType'对象是unsubscriptable:imaplib

时间:2012-06-08 22:00:33

标签: python gmail-imap

这在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()

1 个答案:

答案 0 :(得分:1)

您的问题显然与fetch

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

它为data返回一个NoneType,或者data[0]不太可能返回一个NoneType,而None显然不是可订阅的。您可能需要仔细检查m.fetch的结果,看看它是否会以您期望的形式出现。

这可能是因为此电子邮件已删除(并未删除)。