imaplib , imap_tools 几分钟后返回错误。 (imaplib.abort:命令:SELECT => IMAP4rev1 服务器注销)

Posted

技术标签:

【中文标题】imaplib , imap_tools 几分钟后返回错误。 (imaplib.abort:命令:SELECT => IMAP4rev1 服务器注销)【英文标题】:imaplib , imap_tools return an error after a few minutes. (imaplib.abort: command: SELECT => IMAP4rev1 Server logging out) 【发布时间】:2021-08-14 14:59:51 【问题描述】:

我使用此代码从我的雅虎邮件中获取看不见的新邮件,并找到具有特定 URL 的邮件。

from imap_tools import MailBox, AND
import re
from config import  email, password
from scrap import scrap

yahooSmtpServer = "imap.mail.yahoo.com"
client = MailBox(yahooSmtpServer).login(email, password, 'INBOX')
while True:
    msgs = client.fetch(AND(seen=False))
    for msg in msgs:
        mail = msg.html
        if 'pick' in mail and not 'Combo-pick' in mail:
            for i in re.findall(r'(https?://[^\s]+)', mail):
                if 'pick' in i:
                    link = i.replace('"', "")
                    print(link)
                    try:
                        scrap(link)
                    except:
                        pass
                    
        client.seen(msg.uid, True)
    client.logout()
    client = MailBox(yahooSmtpServer).login(email, password, 'INBOX')

大多数时候它可以工作一段时间。大约15分钟。然后它返回一个错误。

Traceback (most recent call last):
  File "C:\Program Files\Python39\lib\imaplib.py", line 1047, in _command_complete
    typ, data = self._get_tagged_response(tag, expect_bye=logout)
  File "C:\Program Files\Python39\lib\imaplib.py", line 1165, in _get_tagged_response
    self._check_bye()
  File "C:\Program Files\Python39\lib\imaplib.py", line 961, in _check_bye
    raise self.abort(bye[-1].decode(self._encoding, 'replace'))
imaplib.abort: IMAP4rev1 Server logging out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\yahooMail (2)\yahooMail (1)\main.py", line 24, in <module>
    client = MailBox(yahooSmtpServer).login(email, password, 'INBOX')
  File "C:\Program Files\Python39\lib\site-packages\imap_tools\mailbox.py", line 44, in login
    self.folder.set(initial_folder)
  File "C:\Program Files\Python39\lib\site-packages\imap_tools\folder.py", line 37, in set
    result = self.mailbox.box.select(encode_folder(folder))
  File "C:\Program Files\Python39\lib\imaplib.py", line 756, in select
    typ, dat = self._simple_command(name, mailbox)
  File "C:\Program Files\Python39\lib\imaplib.py", line 1230, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "C:\Program Files\Python39\lib\imaplib.py", line 1049, in _command_complete
    raise self.abort('command: %s => %s' % (name, val))
imaplib.abort: command: SELECT => IMAP4rev1 Server logging out

有什么办法可以解决吗?或者我可以每次都在不登录的情况下获取新的/看不见的电子邮件吗? (当我尝试在没有登录循环的情况下这样做时,它没有收到新消息)。 谢谢。

【问题讨论】:

您的代码似乎尽可能快地尝试邮箱,可能每秒几次;为什么不添加time.sleep(60) 60 秒延迟,以便它以更友好的速率进行轮询? @barny 我知道,但我想尽快收到电子邮件。我暂时使用尝试修复了它。但我想知道这个错误到底是什么 “一旦他们到达” - 所以使用 1 秒睡眠。试试看有没有用? @barny 我会的。谢谢 【参考方案1】:

您应该考虑 RFC2177 中描述的 IMAP IDLE 协议扩展

https://datatracker.ietf.org/doc/html/rfc2177

从 0.51.0 开始 imap_tools 支持 IDLE:

https://github.com/ikvk/imap_tools/releases/tag/v0.51.0

【讨论】:

谢谢。我也会试试的。现在,我使用一些例外来修复它。每次返回错误时,它都会重新定义客户端。我选择了这种方式,因为 imap_tools 比使用 imaplib 更容易

以上是关于imaplib , imap_tools 几分钟后返回错误。 (imaplib.abort:命令:SELECT => IMAP4rev1 服务器注销)的主要内容,如果未能解决你的问题,请参考以下文章

Imaplib:如何从 Gmail 中删除电子邮件?

js 实现几分钟前几小时前几天前,以及几分钟后几小时后几天前后

使用 IMAP 阅读 gmail 失败

防止iOS在几分钟后杀死App

为啥我的 websocket 在几分钟后关闭?

几分钟后 PHP 会话超时