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

Python操作Gmail:读取邮件后如何让Gmail标记其为已读?

解决Gmail邮件读取后仍显示未读的问题

嘿,我懂你的困扰——用Python读取了Gmail邮件,但Gmail里还是显示加粗的未读状态对吧?这是因为imaplib默认只会获取邮件内容,不会自动帮你标记已读,得手动添加标记操作才行。

核心原因

IMAP协议里,邮件的“已读”状态是靠\\Seen这个标记来控制的。你之前的代码只做了内容读取,没触发这个标记的设置,所以Gmail还认定邮件是未读的。

修改后的代码示例

我把你的代码补全并加上标记已读的逻辑,你可以直接参考:

import imaplib
import email
from email.header import decode_header

user = 'xxx@gmail.com'
password = 'xxx'  # 要是开了两步验证,这里得用Google的应用专用密码
imap_url = 'imap.gmail.com'

def get_body(msg):
    if msg.is_multipart():
        return get_body(msg.get_payload(0))
    else:
        return msg.get_payload(None, True)

# 建立SSL加密连接
con = imaplib.IMAP4_SSL(imap_url)
# 登录邮箱
con.login(user, password)
# 选择收件箱(别加readonly=True,不然没权限修改邮件标记)
con.select('INBOX')

# 搜索未读邮件(你也可以按需求调整搜索条件)
result, data = con.search(None, 'UNSEEN')
mail_ids = data[0].split()

# 遍历处理每一封邮件
for mail_id in mail_ids:
    # 核心操作:标记邮件为已读
    con.store(mail_id, '+FLAGS', '\\Seen')
    
    # 获取并解析邮件内容
    result, msg_data = con.fetch(mail_id, '(RFC822)')
    for response_part in msg_data:
        if isinstance(response_part, tuple):
            msg = email.message_from_bytes(response_part[1])
            # 解码邮件主题
            subject, encoding = decode_header(msg['Subject'])[0]
            if isinstance(subject, bytes):
                subject = subject.decode(encoding)
            print(f"邮件主题: {subject}")
            # 获取并打印邮件正文
            body = get_body(msg)
            print(f"邮件正文: {body.decode('utf-8')}\n")

# 关闭连接
con.close()
con.logout()

关键细节提醒

  • con.store(mail_id, '+FLAGS', '\\Seen'):这行就是解决问题的核心!它会给指定ID的邮件加上\\Seen标记,Gmail识别到后就会把邮件切换为已读状态。
  • 要是你开启了Google账号的两步验证,直接用原密码登录会失败,得去Google账号设置里生成应用专用密码替换这里的password。
  • 选择收件箱时别加readonly=True参数,否则会没有权限修改邮件的标记状态。

内容的提问来源于stack exchange,提问作者henry dupuis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:37:48