使用 imaplib 阅读电子邮件 - “超过 10000 字节”错误
Posted
技术标签:
【中文标题】使用 imaplib 阅读电子邮件 - “超过 10000 字节”错误【英文标题】:Reading emails with imaplib - "Got more than 10000 bytes" error 【发布时间】:2014-10-16 22:09:17 【问题描述】:我正在尝试使用 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】:第一个电子邮件帐户的问题与其中的邮件数量有关吗?
不是直接,但是是的,差不多。问题在于您尝试一次下载 9000 条消息的整个列表。
发送长得离谱的行一直是一种有用的 DoS 攻击,对于用 C 而不是 Python 实现的程序,对许多网络客户端和服务器的缓冲区溢出攻击。它也可能非常慢,并阻塞网络。但请注意,RFC 最后一次更新是在 1999 年,而 imaplib
是在 1997 年编写的,因此“可笑”的限制可能从那时起发生了变化。
根据RFC 2683,解决此问题的正确方法是不要尝试这样做。 (请参阅第 3.2.1.5 节。)
是否有一些默认设置实现了一些大小限制?
是的。它没有在文档中列出,但由于 RFC 建议限制为 8000 字节,并且允许 10000,我想这是合理的。
如何绕过错误并阅读我的电子邮件?
同样,您应该做的是将其分解为更小的读取。
但只要 gmail 对这么大的搜索没有任何问题,并且您很乐意需要比 90 年代后期标准稍好一点的计算机和网络连接,那么您或许可以绕过这个问题。
幸运的是,就像 stdlib 中的许多模块一样,imaplib
被编写为用作模块的有用示例代码。你总是可以说是这种情况,因为the documentation 链接到顶部的the source。
所以,如果你看一看,你会看到,离顶部不远:
# 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
并改用它),或者您可以在运行时对其进行猴子补丁:
import imaplib
imaplib._MAXLINE = 40000
当然,你必须选择一个你认为更能反映 2014 年荒谬边缘的数字。
【讨论】:
这是一个很好的答案......感谢所有的指针和详细的解释。我经常发现自己纯粹是偶然地推动了“荒谬的边缘”。在这种情况下,虽然我分开了我的请求...... 这个答案实际上是不正确的,因为 RFC 2683 中的 advice 涉及客户端发送并被服务器接受的命令行长度,而不是服务器返回的响应长度。有一个 python 错误页面here 有一些有用的讨论。作为响应,MAXLINE 的默认值似乎增加了 10 倍。以上是关于使用 imaplib 阅读电子邮件 - “超过 10000 字节”错误的主要内容,如果未能解决你的问题,请参考以下文章
获取 HTML、imaplib 和 Django 格式的文本