You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:45:03