问题描述
我使用此代码从我的 yahoo 邮件中获取未看到的新邮件,并找到具有特定 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,'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,'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
有什么办法可以解决吗?或者我可以在每次不登录的情况下获取新的/未见过的电子邮件吗? (当我尝试在没有登录的情况下进行循环时,它没有收到新消息)。 谢谢。
解决方法
您应该考虑 RFC2177 中描述的 IMAP IDLE 协议扩展
https://datatracker.ietf.org/doc/html/rfc2177
imap_tools 做不到,但你可以为 lib 实现它。