Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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阅读电子邮件-“;获取了超过10000字节的数据”;错误_Python_Gmail_Imaplib - Fatal编程技术网

Python 使用imaplib阅读电子邮件-“;获取了超过10000字节的数据”;错误

Python 使用imaplib阅读电子邮件-“;获取了超过10000字节的数据”;错误,python,gmail,imaplib,Python,Gmail,Imaplib,我正在尝试使用imaplib连接到我的gmail帐户: import imaplib mail = imaplib.IMAP4_SSH('imap.gmail.com') mail.login('myemail@gmail.com', 'mypassword') mail.select("inbox") # returns ('OK', [b'12009']) 然而,这一切似乎都很有效: mail.search(None, "ALL") # returns error: command: SE

我正在尝试使用imaplib连接到我的gmail帐户:

import imaplib
mail = imaplib.IMAP4_SSH('imap.gmail.com')
mail.login('myemail@gmail.com', 'mypassword')
mail.select("inbox")
# returns ('OK', [b'12009'])
然而,这一切似乎都很有效:

mail.search(None, "ALL")
# returns error: command: SEARCH => got more than 10000 bytes
mail.logout()
# returns ('NO',
# ["<class 'imaplib.IMAP4.error'>: command: LOGOUT => got more than 10000 bytes"])
mail.search(无,“全部”)
#返回错误:命令:SEARCH=>获取的字节数超过10000个
mail.logout()
#返回('否',
#[“:命令:注销=>获取的字节数超过10000”])
我试图访问的帐户在收件箱中有大约9000封电子邮件。我用另一个帐户尝试了上面的方法,该帐户少于1000个,代码运行良好

第一个电子邮件帐户的问题是否与其中的邮件数量有关?是否存在实现某些大小限制的默认设置

我怎样才能避开这个错误并阅读我的电子邮件

第一个电子邮件帐户的问题是否与其中的邮件数量有关

不是直接的,但是的,差不多。问题在于您试图一次下载9000条消息的整个列表

发送长得离谱的行是一种有用的DoS攻击,对于用C而不是Python实现的程序来说,针对许多网络客户端和服务器的缓冲区溢出攻击。它也可能非常慢,并阻塞网络。但是请注意,RFC最后一次更新是在1999年,而
imaplib
是在1997年编写的,因此“荒谬”的限制可能从那时起已经改变了

解决这个问题的正确方法,根据,是不要尝试这样做。(特别参见第3.2.1.5节。)


是否存在实现某些大小限制的默认设置

对。文档中没有列出它,但是由于RFC建议限制8000字节,并且允许10000字节,我想这是合理的


我怎样才能避开这个错误并阅读我的电子邮件

同样,您应该做的是将其分解为更小的读数

但是,只要gmail在这么大的搜索范围内没有问题,而且你很乐意要求一台比90年代末的标准稍好一点的计算机和网络连接,那么你或许可以绕开这个问题

幸运的是,与stdlib中的许多模块一样,
imaplib
编写的示例代码与用作模块的代码一样有用。你总是可以看出这种情况,因为链接在顶部指向右侧

因此,如果你看一看,你会发现,离顶部不远:

# reading arbitrary length lines. RFC 3501 and 2060 (IMAP 4rev1)
# don't specify a line length. RFC 2683 however suggests limiting client
# command lines to 1000 octets and server command lines to 8000 octets.
# We have selected 10000 for some extra margin and since that is supposedly
# also what UW and Panda IMAP does.
_MAXLINE = 10000
因此,如果您想覆盖此功能,可以将模块分叉(将
imaplib.py
另存为
myimaplib.py
并使用它),或者您可以在运行时对其进行monkeypatch:

import imaplib
imaplib._MAXLINE = 40000

当然,你必须选择一个你认为更能反映2014年荒谬边缘的数字。

这是一个很好的答案。。。谢谢你的指点和详细解释。我经常发现自己被推到“可笑的边缘”纯属偶然。在这种情况下,虽然我拆分了我的请求……但这个答案实际上是不正确的,因为RFC 2683中的问题涉及到客户端发送并被服务器接受的命令行的长度,而不是服务器返回的响应的长度。有一个python bug页面,其中包含一些有用的讨论。作为响应,MAXLINE的默认值似乎增加了10倍。