使用Python的win32com读取Outlook未读邮件遇内容为空问题求助
问题分析与解决方案
一、body_content为空的原因及修复
- 目标邮件本身无正文:
GetLast()获取的是收件箱最后一封邮件,这封邮件可能本身就没有正文内容,建议换成GetFirst()或者直接遍历邮件验证。 - 邮件为HTML格式:部分邮件仅以HTML格式存储正文,
Body属性只能读取纯文本内容,此时会返回空值。可以尝试用HTMLBody属性获取HTML格式的正文,若需要纯文本可自行转换。 - 默认收件箱不匹配:如果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
相关产品推荐
相关产品推荐

