如何用Python读取IMAP邮箱HTML邮件并将未读邮件标记为已读
解决方案
不需要切换到imaplib做底层开发,imbox本身已经内置了标记邮件为已读的功能,仅需对现有代码做少量调整即可。
核心修改点
- 每封邮件处理逻辑执行完成后,调用
imbox.mark_seen(uid)方法,传入当前邮件的uid即可将其标记为已读,避免下次重复处理 - 原代码中
mail_dict会在循环中被反复覆盖,最终仅会输出最后一封邮件的信息,可新增列表存储所有处理完成的邮件数据 - 如果你需要提取HTML格式的邮件正文,可将原代码中
message.body['plain']替换为message.body['html']
修改后的完整代码
from imbox import Imbox import html2text # 存储所有处理完成的邮件 processed_mails = [] with Imbox('<IMAP SERVER>', username='<USER>', password='<PASS>', ssl=True, ssl_context=None, starttls=False) as imbox: unread_inbox_messages = imbox.messages(unread=True) for uid, message in unread_inbox_messages: mail_from = message.sent_from[0]['email'] mail_subject = message.subject h = html2text.HTML2Text() h.ignore_links = True # 若需要原始HTML正文,可直接取 message.body['html'][0] 不需要经过html2text处理 output = h.handle(message.body['html'][0]).replace("\\r\\n", "") output = output.replace("\n", "") mail_body = output[2:-2] mail_dict = { 'email': { 'From': mail_from, 'Subject': mail_subject, 'Body': mail_body } } processed_mails.append(mail_dict) # 标记当前邮件为已读 imbox.mark_seen(uid) # 输出所有处理完成的邮件 for mail in processed_mails: print(mail)
补充说明
如果你的需求是直接保留原始HTML格式的正文不需要转成纯文本,可以直接去掉html2text处理逻辑,直接取message.body['html'][0]作为mail_body的值即可。
内容的提问来源于stack exchange,提问作者Robba
相关产品推荐
相关产品推荐

