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

使用Python的win32com读取Outlook未读邮件遇内容为空问题求助

问题分析与解决方案

一、body_content为空的原因及修复

  1. 目标邮件本身无正文:GetLast()获取的是收件箱最后一封邮件,这封邮件可能本身就没有正文内容,建议换成GetFirst()或者直接遍历邮件验证。
  2. 邮件为HTML格式:部分邮件仅以HTML格式存储正文,Body属性只能读取纯文本内容,此时会返回空值。可以尝试用HTMLBody属性获取HTML格式的正文,若需要纯文本可自行转换。
  3. 默认收件箱不匹配:如果Outlook有多个账户,outlook.GetDefaultFolder(6)默认返回的是系统默认账户的收件箱,若你的未读邮件在其他账户下,需要切换到对应账户的收件箱。

二、读取所有未读邮件的实现代码

以下是修正后的代码,可筛选并读取所有未读邮件,同时兼容不同格式的正文:

import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

# 获取默认账户的收件箱(指定账户的方法见下方备注)
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items

# 筛选未读邮件,Outlook的Restrict方法使用DASL查询语法
unread_messages = messages.Restrict("[Unread] = True")

# 遍历所有未读邮件
for msg in unread_messages:
    print(f"主题: {msg.Subject}")
    print(f"发件人: {msg.SenderName}")
    # 优先取纯文本正文,为空则取HTML正文
    body_content = msg.Body if msg.Body else msg.HTMLBody
    print(f"正文内容:\n{body_content}\n" + "-"*50)

    # 可选:将邮件标记为已读
    # msg.Unread = False
    # msg.Save()

备注:读取指定账户的收件箱

如果需要读取非默认账户的未读邮件,可通过遍历账户列表定位目标账户:

# 替换为你要读取的账户名称
target_account = "你的邮箱账户名称"
target_inbox = None

for account in outlook.Accounts:
    if account.DeliveryStore.DisplayName == target_account:
        target_inbox = account.DeliveryStore.GetDefaultFolder(6)
        break

if target_inbox:
    messages = target_inbox.Items
    unread_messages = messages.Restrict("[Unread] = True")
    # 后续遍历逻辑与上述代码一致

关键说明

  • 使用Items.Restrict()筛选未读邮件比遍历所有邮件再判断效率更高,适合邮件数量较多的场景。
  • 部分邮件可能只包含HTML格式的正文,因此需要同时兼容Body和HTMLBody两个属性。
  • 若需要将未读邮件标记为已读,取消代码中msg.Unread = False和msg.Save()的注释即可。

内容的提问来源于stack exchange,提问作者Harsha Biyani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:57:03