我正在尝试从Gmail下载附件,使用我在网上找到的一些代码组合,以及我自己编辑的一些代码。但是,以下代码:
import email, getpass, imaplib, os, random, time
import oauth2 as oauth
import oauth2.clients.imap as imaplib
MY_EMAIL = 'example@gmail.com'
MY_TOKEN = "token"
MY_SECRET = "secret"
consumer = oauth.Consumer('anonymous', 'anonymous')
token = oauth.Token(MY_TOKEN, MY_SECRET)
url = "https://mail.google.com/mail/b/"+MY_EMAIL+"/imap/"
m = imaplib.IMAP4_SSL('imap.gmail.com')
m.authenticate(url, consumer, token)
m.select('INBOX')
items = m.select("UNSEEN");
items = items[0].split()
for emailid in items:
data = m.fetch(emailid, "(RFC822)")
返回此错误:
imaplib.error:命令FETCH非法 在州AUTH
为什么在我获得授权时Fetch会非法?
答案 0 :(得分:3)
您的呼叫选择缺少错误检查。通常,这是我将如何构建与邮箱的连接的第一部分:
# self.conn is an instance of IMAP4 connected to my server.
status, msgs = self.conn.select('INBOX')
if status != 'OK':
return # could be break, or continue, depending on surrounding code.
msgs = int(msgs[0])
基本上,您遇到的问题是您选择了一个不存在的邮箱,您的状态消息可能不是“OK”,并且您正在迭代的值不是有效。请记住,select需要邮箱名称。它不会根据标志进行搜索(这可能是您尝试使用“UNSEEN”)。当您选择一个不存在的邮箱时,您实际上会将其作为回复:
('NO', ['The requested item could not be found.'])
在这种情况下,for email id in items
无法正常运行。不幸的是,不是你以任何方式追求的。您在有效邮箱上获得的内容如下:
('OK', ['337'])
希望有所帮助。
要在评论中解决问题,如果您想要实际检索邮箱中看不见的邮件,请使用此邮件:
status, msgs = self.conn.select('INBOX')
# returns ('OK', ['336'])
status, ids = self.conn.search(None, 'UNSEEN')
# returns ('OK', ['324 325 326 336'])
if status == 'OK':
ids = map(int, ids[0].split())
响应类似于select的响应,但是对于消息数量而不是单个整数,您将得到一个id列表。
答案 1 :(得分:1)
为什么在我授权的情况下Fetch会非法?
IMAP有一个国家概念。
如果您选择了文件夹,则只能获取消息。
这是一张很好的照片,显示了这一点:
图片来源:http://www.tcpipguide.com/free/t_IMAP4GeneralOperationClientServerCommunicationandS-2.htm