Python IMAP TypeError:“ Nonetype”对象不可下标

时间:2019-03-22 02:39:15

标签: python-3.x imaplib

我正在使用imap检查与特定主题匹配的未读电子邮件。当我从测试电子邮件中收到一封电子邮件时,一切正常,但是当它来自需要检查邮件的自动系统时,我收到一条错误消息,指出'Nonetype' object is not subscriptable.以下是我的代码:

import imaplib, time, email, mailbox, datetime
server = "imap.gmail.com"
port = 993
user = "Redacted"
password = "Redacted"

def main():
    while True:            
        conn = imaplib.IMAP4_SSL(server, port)
        conn.login(user, password)
        conn.list()
        conn.select('inbox', readonly=True)
        result, data = conn.search(None, '(UNSEEN SUBJECT "Alert: Storage Almost At Max Capacity")')
        i = len(data[0].split())

        for x in range (i):
            latest_email_uid = data[0].split()[x]
            result, email_data = conn.uid('fetch', latest_email_uid, '(RFC822)')
            raw_email = email_data[0][1] #This is where it throws the error
            raw_email_string = raw_email.decode('utf-8')
            email_message = email.message_from_string(raw_email_string)
            date_tuple = email.utils.parsedate_tz(email_message['Date'])
            local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple))
            local_message_date = "%s" %(str(local_date.strftime("%a, %d %b %Y %H:%M:%S")))
            for part in email_message.walk():
                if part.get_content_type() == "text/plain":
                    body = part.get_payload(decode=True)
                    body = body.decode('utf-8')
                    body = body.split()
                    #Do some stuff
        conn.close()

if __name__ == "__main__":
    main()

以下是回溯:

Traceback (most recent call last):
    File "TestEmail.py", line 200, in <module>
        main()
    File "TestEmail.py", line 168, in main
        raw_email = email_data[0][1]
TypeError: 'NoneType' object is not subscriptable.

我不明白为什么这在从某人的电子邮件发送的电子邮件中有效,但在我的系统通过电子邮件向我发送警报时却不起作用。有明显的解决办法吗?

编辑:我尝试打印resultemail变量。以下是它们的输出:

Result: OK
Email: [None]

如果我针对具有相同主题但从测试电子邮件发送的电子邮件对脚本进行了测试,则result仍然是“ OK”,但其中包含一封电子邮件。

EDIT#2:我注意到电子邮件的格式有些不同。可以被正常接收的是text/plaintext/html,而不能被接收的是text/plainContent-Transfer-Encoding: 7-bit。我该如何补救?如果我通过过滤器转发电子邮件并检查从过滤器收到的电子邮件,我的代码就可以正常工作。但是,我不想为此使用多封电子邮件。

1 个答案:

答案 0 :(得分:1)

您正在搜索消息序列号,并通过uid获取。 如果要使用conn.uid('fetch'),则还必须使用conn.uid('search'),否则,您将搜索苹果并获取橘子。

因此,由于并非所有的MSN都是UID,因此您偶尔会获取不存在的消息,这不是错误,但它不会返回任何信息。