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

如何从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-

我的疑问:

  1. 如何获取非MailItem类型邮件的发件人邮箱?
  2. 如何查看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 = MailItem
    • IPM.Schedule.Meeting.Request = MeetingItem
    • IPM.Contact = ContactItem

代码示例:

# 获取数字类型标识
item_class_code = msg.Class
# 获取字符串类型标识
item_class_str = msg.MessageClass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:24:18