如何从MeetingItem等非MailItem类型获取Outlook发件人邮箱地址?
问题描述
我正在编写一个邮件查找程序,需要实现一个能返回任意类型邮件发件人邮箱地址的函数。目前我写了如下函数:
def return_sender(msg): if msg.Class == 43 # 注:此处缺少冒号,属于语法笔误 if msg.SenderEmailType == "EX": if msg.Sender.GetExchangeUser() != None: return msg.Sender.GetExchangeUser().PrimarySmtpAddress else: return msg.Sender.GetExchangeDistributionList().PrimarySmtpAddress else: return msg.SenderEmailAddress
这个函数仅支持Class 43(MailItem类型),处理Class 53(MeetingItem类型)时:
- 调用
msg.Sender会触发AttributeError - 调用
msg.SenderEmailAddress返回的是Exchange格式的地址,示例如下:
/O=EXCHANGELABS/OU=EXCHANGEADMINISTRATIVEGROUP(FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=6F467C825619482293F429C0BDE6F1DB-
我的疑问:
- 如何获取非MailItem类型邮件的发件人邮箱?
- 如何查看Outlook邮件的类型?
解决方案
一、获取非MailItem类型(如MeetingItem)的发件人邮箱
不同类型的Outlook Item属性差异较大,核心是针对性适配属性逻辑:
通用兼容方案
def get_sender_email(msg): # 优先尝试全局通用的GetSenderEmailAddress方法 try: smtp_addr = msg.GetSenderEmailAddress() # 若返回Exchange格式地址,尝试解析为SMTP if smtp_addr.startswith("/O="): ns = msg.Session recip = ns.CreateRecipient(smtp_addr) if recip.Resolve(): exch_user = recip.AddressEntry.GetExchangeUser() if exch_user: return exch_user.PrimarySmtpAddress exch_dl = recip.AddressEntry.GetExchangeDistributionList() if exch_dl: return exch_dl.PrimarySmtpAddress return smtp_addr return smtp_addr except AttributeError: pass # 针对MailItem(Class=43)的原有逻辑 if msg.Class == 43: if msg.SenderEmailType == "EX": exch_user = msg.Sender.GetExchangeUser() if exch_user: return exch_user.PrimarySmtpAddress exch_dl = msg.Sender.GetExchangeDistributionList() if exch_dl: return exch_dl.PrimarySmtpAddress return msg.SenderEmailAddress # 针对MeetingItem(Class=53)的专属逻辑 elif msg.Class == 53: # 会议邀请的发起者对应Organizer属性,而非Sender organizer = msg.Organizer if organizer: ns = msg.Session recip = ns.CreateRecipient(organizer) if recip.Resolve(): exch_user = recip.AddressEntry.GetExchangeUser() if exch_user: return exch_user.PrimarySmtpAddress exch_dl = recip.AddressEntry.GetExchangeDistributionList() if exch_dl: return exch_dl.PrimarySmtpAddress # 兜底返回原始地址 return msg.SenderEmailAddress
关键说明
- MeetingItem没有
Sender属性,需使用Organizer获取会议发起者 - Exchange格式地址可通过
Session.CreateRecipient解析为标准SMTP地址
二、查看Outlook邮件的类型
有两种可靠方式:
- 通过
Class属性:返回数字常量,对应固定类型:- 43 = MailItem(普通邮件)
- 53 = MeetingItem(会议邀请)
- 40 = ContactItem(联系人)
- 68 = TaskItem(任务)
- 通过
MessageClass属性:返回直观的字符串标识:IPM.Note= MailItemIPM.Schedule.Meeting.Request= MeetingItemIPM.Contact= ContactItem
代码示例:
# 获取数字类型标识 item_class_code = msg.Class # 获取字符串类型标识 item_class_str = msg.MessageClass
内容的提问来源于stack exchange,提问作者czerwonyjakcegla
相关产品推荐
相关产品推荐

