我正在尝试使用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,代码工作正常。
第一个电子邮件帐户的问题是否与其中的邮件数量相关?是否有一些默认设置实现了一些大小限制?
如何解决错误并阅读我的电子邮件?
答案 0 :(得分:28)
第一个电子邮件帐户的问题是否与其中的邮件数量相关?
不直接,但是,差不多。问题在于您尝试一次下载整个9000条消息列表。
发送可笑的长行是一种有用的DoS攻击,对于用C而不是Python实现的程序,缓冲区溢出攻击许多网络客户端和服务器。它也可能非常慢,并阻塞网络。但请注意,RFC最后一次更新是在1999年,imaplib
是在1997年写的,所以“荒谬”的限制可能从那时起发生了变化。
是否有一些默认设置实现了一些大小限制?
是。它没有在文档中列出,但由于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年荒谬倾向的数字。