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.py为myimaplib.py并使用它),或者你可以在运行时monkeypatch它:
import imaplib
imaplib._MAXLINE = 40000
Run Code Online (Sandbox Code Playgroud)
当然,你必须选择一个你认为更能反映2014年荒谬边缘的数字.