我无法在python中使用imap提取邮件

时间:2019-03-15 18:05:55

标签: python python-3.7

fetch方法出现此错误:

  

imaplib.IMAP4.error:FETCH命令错误:错误[b'无法解析命令']

我没有附加我的所有代码。我想使用imap获取看不见的味精,以获取正文并将其保存为文本,然后下载附件。

import imaplib, email, os
user= "test9101997"
password="Monday@123"
imap_url="imap.gmail.com"
attach_dir='E:\PROJECT\attachment'
filePath='D:\ATTACH'     
con=imaplib.IMAP4_SSL(imap_url)
con.login(user,password)
con.select('INBOX')
#UIDs=con.search(None,'UNSEEN')
#print(UIDs)
(result, messages) = con.search(None, 'UnSeen')
if result == "OK":
   for message in messages:
        try: 
          ret, data =con.fetch(message,'(RFC822)')
        except:
             print ("No new emails to read.")
                    #self.close_connection()
                    #exit()
                    #result, data=con.fetch(i,'(RFC822)')
             raw=email.message_from_bytes(data[0][1])

1 个答案:

答案 0 :(得分:0)

我认为您可能对con.search()的返回值感到困惑。如果您在调用之后查看messages的值(假设resultOK),则它是字符串的集合,而不是消息ID的列表。也就是说,在像这样的通话之后:

result, messages = con.search(None, 'UnSeen')

messages的值可能类似于:

['1 2 15 20']

因此,当您尝试像这样迭代时:

for message in messages:

在第一次循环迭代中,message的值为1 2 15 20,这就是为什么出现命令错误的原因:您发出的请求没有任何意义。您将改为执行以下操作:

(result, blocks) = con.search(None, 'UnSeen')

if result == "OK":
    for messages in blocks:
        for message in messages.split():
            ret, data = con.fetch(message, '(RFC822)')
            raw = email.message_from_bytes(data[0][1])

imaplib模块确实没有充分的理由以这种方式返回数据。