Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:';非类型';对象不可订阅:imaplib_Python_Gmail Imap - Fatal编程技术网

Python:';非类型';对象不可订阅:imaplib

Python:';非类型';对象不可订阅:imaplib,python,gmail-imap,Python,Gmail Imap,这在SO中有广泛的介绍,所以我提前道歉……然而,我已经浏览了这些帖子,无法让它发挥作用 目标 要从gmail获得符合特定条件的电子邮件,请保存附件,然后删除它们 问题 所以,除了删除电子邮件,我可以让一切正常工作。它删除了一些,然后出现以下错误: 回溯(最近一次调用last):文件“get_overdues.py”,第22行, 在里面 email_body=data[0][1]类型错误:“NoneType”对象不可订阅 每次我运行它,它会删除更多的电子邮件,然后以相同的错误退出。这必须在cron

这在SO中有广泛的介绍,所以我提前道歉……然而,我已经浏览了这些帖子,无法让它发挥作用

目标
要从gmail获得符合特定条件的电子邮件,请保存附件,然后删除它们

问题
所以,除了删除电子邮件,我可以让一切正常工作。它删除了一些,然后出现以下错误:

回溯(最近一次调用last):文件“get_overdues.py”,第22行, 在里面 email_body=data[0][1]类型错误:“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()

显然,您的问题在于
获取

resp, data = m.fetch(emailid, "(RFC822)")
email_body = data[0][1]
它为
数据
数据[0]
返回一个非类型,
显然不可下标。您可能需要再次检查
m.fetch
的结果,并查看它是否以您期望的形式出现


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

错误清楚地告诉您数据或数据[0]为无,因此这似乎是一个显而易见的地方。对于空消息,也许是这样?无论如何,如果不调试正在返回的内容(例如,当数据为无时记录resp)和/或不确定它在哪条消息上失败,您将永远无法解决此问题。我认为它可能在带有附件的转发上失败。转发不是包含两个附件的三部分邮件吗?首先是附加的邮件,然后是原始邮件的附件。我将对此进行测试并报告。任何时候处理“未知”/“可能格式不正确”的数据时,都是您的朋友。我发现在Gmail中使用Python的IMAP时尤其如此。谢谢jedwards。检查一下。
try/except
并不能将您完全保存在这里——它会抑制错误,但它不会真正处理这个问题。因此,例如,如果您试图删除的电子邮件出现错误,
try/except
只会使其跳过,而不是实际处理,除非您找出错误并提供其他代码来修复。这些消息是自动发送的,因此它们是相同的。很奇怪