• Python报错:AttributeError: <unknown>.DeliveryStore 获取Outlook邮箱时报错


    目录

    报错提示:

    现象描述

    代码解释:

    原因分析:


    报错提示:

    in get_outlook_email

        return account.DeliveryStore.DisplayName

    line 106, in

        email_address = get_outlook_email()

    现象描述

    获取outlook本地邮箱地址时,出现AttributeError,这是原代码:

    1. def get_outlook_email():
    2. """Get the user's Outlook email address"""
    3. outlook = win32.Dispatch('Outlook.Application')
    4. namespace = outlook.GetNamespace('MAPI')
    5. inbox = namespace.GetDefaultFolder(6) # 6 represents the inbox folder
    6. account = inbox.Parent
    7. return account.DeliveryStore.DisplayName
    '
    运行

    代码解释:

    1. 代码创建了Outlook应用程序实例和MAPI命名空间

    2. 获取默认收件箱文件夹(GetDefaultFolder(6),6代表收件箱)。

    3. 从这个收件箱的Parent属性获取关联的账户对象

    原因分析:

    inbox = namespace.GetDefaultFolder(6)  # 6 represents the inbox folder

    因为GetDefaultFolder方法是从MAPI命名空间获取当前登录用户的默认文件夹,例如收件箱、发件箱、删除邮件等。

    1. 如果用户只有一个普通的电子邮件账户,那么可以正常工作,因为默认收件箱的父级(Parent)就是这个电子邮件账户对象。

    2. 如果用户配置了多个电子邮件账户,或者有一些特殊类型的邮箱(如共享邮箱、公共文件夹等),那么可能会失败。

    3. 因为如果Parent返回的不是一个有效的电子邮件账户对象,那么当代码尝试访问这个对象的DeliveryStore属性时,就会引发AttributeError异常,因为这个对象根本没有DeliveryStore属性。

    举个例子,假设用户的Outlook中配置了一个普通的工作邮箱account1@company.com,和一个共享邮箱shared@company.com

    如果获取的是account1@company.com账户对应的收件箱,那么它可以正常工作。但如果获取的是shared@company.com共享邮箱的收件箱,由于共享邮箱没有关联有效的电子邮件账户对象,所以会引发AttributeError异常。

    综上所述,第二种方法的失败原因不是由于获取到了共享邮箱,而是它只考虑了当前登录用户的默认收件箱,而没有处理其他情况下的账户类型。

    解决方案:

    判断一个账户对象是否为有效电子邮件账户的关键在于检查该账户对象是否有 DeliveryStore 属性。

    if account.DeliveryStore:

    就是在检查当前账户对象 account 是否有 DeliveryStore 属性。如果有,则说明这是一个有效的电子邮件账户。

    DeliveryStore 属性代表着该账户对应的电子邮件传输存储。只有真正的电子邮件账户才会有这个属性,而像共享邮箱、公共文件夹等特殊类型的账户则没有 DeliveryStore 属性。

    所以,通过检查 DeliveryStore 属性的存在与否,代码可以有效地区分出哪些账户对象是有效的电子邮件账户。

    如果 account.DeliveryStore 存在,那么代码就从这个 DeliveryStore 对象的 DisplayName 属性中获取邮箱地址:

    return account.DeliveryStore.DisplayName

    这样就能够获取到该有效电子邮件账户的邮箱地址。

    相反,如果 account.DeliveryStore 不存在,那么代码就会跳过该账户对象,继续检查下一个账户对象。

    通过这种方式,第一种方法可以遍历所有的账户对象,只处理有效的电子邮件账户,从而可靠地获取用户的邮箱地址。

    总的来说,利用 DeliveryStore 属性的存在与否作为判断标准,是这种方法能够正确识别有效电子邮件账户的关键所在。

    修改后代码:

    1. def get_outlook_email():
    2. """Get the user's Outlook email address"""
    3. outlook = win32.Dispatch('Outlook.Application').GetNamespace('MAPI')
    4. for account in outlook.Accounts:
    5. if account.DeliveryStore:
    6. return account.DeliveryStore.DisplayName
    7. return None
    '
    运行

  • 相关阅读:
    Linux下如何打包库供别人使用
    UTF-8字符串操作方法
    【React】 第九部分 react 路由
    Redis数据库持久化
    Java 领域模型之失血、贫血、充血、胀血模型
    《人类简史》笔记二——一场永远的革命
    Nvme Spec 第一章节学习
    如何区分快解析内网穿透和Nginx端口映射?
    记一次spark数据倾斜实践
    linux安装chrome及其驱动
  • 原文地址:https://blog.csdn.net/Viviane_2022/article/details/139453535