用imaplib读取电子邮件 - "超过10000字节"错误

pan*_*ita 14 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'])
Run Code Online (Sandbox Code Playgroud)

然而,这一切似乎都很好用:

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"])
Run Code Online (Sandbox Code Playgroud)

我正在尝试访问的帐户在收件箱中有大约9,000封电子邮件.我尝试了上面的另一个帐户,其中少于1,000,代码工作正常.

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

如何绕过错误并阅读我的电子邮件?

aba*_*ert 29

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

不是直接,但是,是的,非常.问题在于您尝试一次下载整个9000条消息列表.

发送可笑的长行是一种有用的DoS攻击,对于用C而不是Python实现的程序,缓冲区溢出攻击许多网络客户端和服务器.它也可能非常慢,并阻塞网络.但请注意,RFC最后一次更新于1999年,并imaplib于1997年编写,因此"荒谬"的限制可能已经发生了变化.

根据RFC 2683,解决这个问题的正确方法是不要试图这样做.(特别参见第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
Run Code Online (Sandbox Code Playgroud)

所以,如果你想覆盖它,你可以分叉模块(另存imaplib.pymyimaplib.py并使用它),或者你可以在运行时monkeypatch它:

import imaplib
imaplib._MAXLINE = 40000
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案实际上是不正确的,因为 RFC 2683 中的[建议](http://tools.ietf.org/html/rfc2683#section-3.2.1.5) 涉及客户端发送并被客户端接受的命令行长度。服务器,而不是从服务器返回的响应的长度。[这里](http://bugs.python.org/issue23647) 有一个 python bug 页面,其中有一些有用的讨论。看起来 MAXLINE 的默认值已经增加了 10 倍作为响应。 (2认同)