在Python中使用stmplib的索引器

在Python中使用stmplib的索引器,python,smtp,imap,Python,Smtp,Imap,我正在尝试转发和删除gmail帐户中的某些电子邮件,并通过单独的流程运行其他电子邮件。我一直在跟踪,但由于某种原因,我遇到了一个索引器,我的trycatch是为另一个问题(如果收件箱是空的)收集的 # Connect and login to email imap = imaplib.IMAP4_SSL('imap.gmail.com') imap.login('sender','password') imap.list() imap.select('inbox') smtp = smtpli

我正在尝试转发和删除gmail帐户中的某些电子邮件,并通过单独的流程运行其他电子邮件。我一直在跟踪,但由于某种原因,我遇到了一个
索引器
,我的
try
catch
是为另一个问题(如果收件箱是空的)收集的

# Connect and login to email
imap = imaplib.IMAP4_SSL('imap.gmail.com')
imap.login('sender','password')
imap.list()
imap.select('inbox')

smtp = smtplib.SMTP_SSL('smtp.gmail.com')
smtp.login('sender','password')

try:
    result, data = imap.search(None,'ALL') # search and return sequential ids
    ids_list = data[0].split()
    print 'Total emails: '+str(len(ids_list))
    latest_id = ids_list[-1]

    #Process each email in inbox
    for i in ids_list:
        t, d = imap.fetch(i, '(RFC822)')
        for res_part in d:
            if isinstance(res_part, tuple):
                msg = email.message_from_string(res_part[1])
                subject = msg['subject']
                print 'Subject: '+subject
        if subject != 'Subject of email I care about':
            print 'Dealing with it'
            #Forward email to another account
            #Attempt to forward an email
            text = res_part[0][1] #Something is wrong with this line, throws exception
            smtp.sendmail('sender', 'destination', text)
            imap.store(i, '+FLAGS', '\\Deleted')
            imap.expunge()
        else:
            #Process email
            print 'Don\'t delete this'

except IndexError:
    print 'Error'
    #Inbox is empty (Or in this case apparently not)

我似乎不明白为什么我会收到这个错误。如果您有任何见解,我们将不胜感激。

您需要缩进

if subject != 'Subject of email I care about':
            print 'Dealing with it'
            #Forward email to another account
            #Attempt to forward an email
            text = res_part[0][1] #Something is wrong with this line, throws exception
            smtp.sendmail('sender', 'destination', text)
            imap.store(i, '+FLAGS', '\\Deleted')
            imap.expunge()
else:
            #Process email
            print 'Don\'t delete this'

如果没有,那么res\u part就不会是一个变量。

我假设缩进中有输入错误,因为这不是问题所在。然而,您正在犯另一个错误,使用
res\u part
。在您的代码中,您使用
res\u part
作为元素,在数据
d
上循环。现在,这意味着每次迭代,
resu部分
只包含
d
的一部分。因此,它将具有较低的维度。您可能需要以下内容:

# Connect and login to email
imap = imaplib.IMAP4_SSL('imap.gmail.com')
imap.login('sender','password')
imap.list()
imap.select('inbox')

smtp = smtplib.SMTP_SSL('smtp.gmail.com')
smtp.login('sender','password')

try:
    result, data = imap.search(None,'ALL') # search and return sequential ids
    ids_list = data[0].split()
    print 'Total emails: '+str(len(ids_list))
    latest_id = ids_list[-1]

    #Process each email in inbox
    for i in ids_list:
        t, d = imap.fetch(i, '(RFC822)')
        text = d[0][1]
        msg = email.message_from_string(text)
        subject = msg['subject']
        print 'Subject: '+subject
        if subject != 'Subject of email I care about':
            print 'Dealing with it'
            #Forward email to another account
            #Attempt to forward an email
            smtp.sendmail('sender', 'destination', text)
            imap.store(i, '+FLAGS', '\\Deleted')
            imap.expunge()
        else:
            #Process email
            print 'Don\'t delete this'

except IndexError:
    print 'Error'
    # Probably won't happen for empty inbox either, as for loop will not execute
    # To catch an empty inbox you could you an `else:` construct.
    #Inbox is empty (Or in this case apparently not)

我还没有测试过这段代码。特别是我假设您从数据部分获取消息的方式与您实现它的方式相同。此外,这并不测试
d
的第一个元素,即
d[0]
是元组。我假设,正如您链接到的示例中所假设的那样。

您的缩进是否如图所示正确?我本来希望
if subject
行缩进到
if isinstance
行下面,但事实并非如此!哇,我真傻。