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

如何用Python+win32com.client获取Outlook邮件抄送邮箱地址

问题背景

使用Python的win32com库读取Outlook邮件时,直接调用邮件对象的cc属性仅能返回抄送收件人的显示姓名,无法获取真实邮箱地址,已完成的基础代码如下:

import win32com.client
# 初始化Outlook应用
outlook = win32com.client.Dispatch('outlook.application')
# 读取收件箱
inbox = outlook.GetNamespace('MAPI')
inbox = inbox.GetDefaultFolder(6)
messages = inbox.Items
可行实现方案

MailItem.CC属性本身设计就是返回分号分隔的收件人显示名称,要获取真实SMTP邮箱地址,需要遍历邮件的收件人集合做解析,核心逻辑如下:

  • 邮件所有收件人(含普通收件人、抄送、密送)都存储在Recipients集合中,单个收件人对象的Type属性值为2时,对应当前收件人是抄送(CC)类型(1为普通收件人、3为密送收件人)
  • 每个收件人关联的地址信息在AddressEntry属性下,需要区分地址类型取值:
    • 若为Exchange企业内部地址(地址类型为EX),需要调用GetExchangeUser()方法获取Exchange用户对象,再取其PrimarySmtpAddress属性得到真实邮箱
    • 若为普通外部SMTP地址,直接取AddressEntry.Address属性即可

完整实现代码:

import win32com.client

# 初始化Outlook连接
outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace('MAPI')
inbox = mapi.GetDefaultFolder(6)
messages = inbox.Items

# 读取目标邮件
target_mail = messages.Item(9)
cc_email_list = []

for recipient in target_mail.Recipients:
    # 筛选抄送类型收件人
    if recipient.Type == 2:
        address_entry = recipient.AddressEntry
        # 处理Exchange内部地址
        if address_entry.Type == "EX":
            exchange_user = address_entry.GetExchangeUser()
            if exchange_user:
                cc_email_list.append(exchange_user.PrimarySmtpAddress)
        # 处理普通SMTP地址
        else:
            cc_email_list.append(address_entry.Address)

# 输出结果
print("抄送收件人邮箱列表:", cc_email_list)
# 如需和原生CC格式一致,可用分号拼接
print("分号拼接格式:", ";".join(cc_email_list))

注意:企业域环境下的内部收件人如果直接读取AddressEntry.Address,会返回Exchange层级格式的内部标识,不是可直接使用的SMTP邮箱地址,必须通过GetExchangeUser()做转换。

内容的提问来源于stack exchange,提问作者Avinash Chauhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:06:52