Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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.error:命令获取在身份验证状态下非法_Python_Imaplib - Fatal编程技术网

Python imaplib.error:命令获取在身份验证状态下非法

Python imaplib.error:命令获取在身份验证状态下非法,python,imaplib,Python,Imaplib,我正在尝试从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.

我正在尝试从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:命令获取非法 州内授权


为什么在我被授权的情况下提取是非法的?

您对要选择的调用缺少错误检查。通常,我将这样构造邮箱连接的第一部分:

# 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需要一个邮箱名称。它不会基于标志(可能是您正试图使用“未看到”进行搜索)进行搜索。当您选择一个不存在的邮箱时,您实际上会得到以下响应:

('NO', ['The requested item could not be found.'])
在这种情况下,项中电子邮件id的
操作不正常。不幸的是,这根本不是你想要的。您在有效邮箱中得到的信息如下:

('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列表,而不是消息数量的单个整数

为什么在我被授权的情况下提取是非法的

IMAP有一个状态概念

只有选择了文件夹,才能提取邮件

这是一张很好的图片,显示了以下内容:


图片来源:

嗯,我明白了,谢谢。稍微相关:我如何搜索看不见的电子邮件?m、 search(“UNSEEN”)也会给出一个错误。@JacobK-要获取未看到的邮件,您需要(在选择邮箱后):
conn.search(None,'UNSEEN')
@JacobK-没问题,很乐意提供帮助。