使用imaplib阅读电子邮件 - "获得超过10000个字节"错误

时间:2014-08-23 00:51:50

标签: 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: SEARCH => got more than 10000 bytes
mail.logout()
# returns ('NO',
# ["<class 'imaplib.IMAP4.error'>: command: LOGOUT => got more than 10000 bytes"])

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

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

如何解决错误并阅读我的电子邮件?

1 个答案:

答案 0 :(得分:28)

  

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

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

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

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


  

是否有一些默认设置实现了一些大小限制?

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


  

如何解决错误并阅读我的电子邮件?

同样,你应该做的是把它分解成更小的读数。

但是,由于漫长的gmail对于这么大的搜索没有任何问题,并且你很高兴要求计算机和网络连接比90年代后期的标准好一点,你可能可以逃避解决问题。

幸运的是,像stdlib中的许多模块一样,imaplib被编写为有用的示例代码,可用作模块。你可以随时告诉这种情况,因为RFC 2683链接到顶部的the documentation

所以,如果你看看,你会看到,离顶部不远:

# 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年荒谬倾向的数字。