如何用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属性即可
- 若为Exchange企业内部地址(地址类型为
完整实现代码:
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
相关产品推荐
相关产品推荐

