当前位置: 首页 > news >正文

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

目录

报错提示:

现象描述

代码解释:

原因分析:


报错提示:

in get_outlook_email

    return account.DeliveryStore.DisplayName

line 106, in <module>

    email_address = get_outlook_email()

现象描述

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

def get_outlook_email():"""Get the user's Outlook email address"""outlook = win32.Dispatch('Outlook.Application')namespace = outlook.GetNamespace('MAPI')inbox = namespace.GetDefaultFolder(6)  # 6 represents the inbox folderaccount = inbox.Parentreturn 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 属性的存在与否作为判断标准,是这种方法能够正确识别有效电子邮件账户的关键所在。

修改后代码:

def get_outlook_email():"""Get the user's Outlook email address"""outlook = win32.Dispatch('Outlook.Application').GetNamespace('MAPI')for account in outlook.Accounts:if account.DeliveryStore:return account.DeliveryStore.DisplayNamereturn None

http://www.lryc.cn/news/362799.html

相关文章:

  • 如何 Logrus IT 的质量评估门户帮助提升在线商店前端(案例研究)
  • 程序调试
  • 深度学习-07-反向传播的自动化
  • 四川景源畅信:抖音做直播有哪些人气品类?
  • 闲鱼无货源-高级班,最全·最新·最干,紧贴热点 深度学习(17节课)
  • 力扣 739. 每日温度
  • 工业网关有效解决企业在数据采集、传输和整合方面的痛点问题-天拓四方
  • 金融壹账通的“新机遇” 用科技赋能助力金融机构做大做强“五篇大文章
  • Day 42 LVS四层负载均衡
  • 【源码】源码物品销售系统多种支付接口出售源码轻松赚钱
  • 图像操作的基石Numpy
  • 如何利用exceljs将data数据导出表格实现日期去重,同时保留对应日期的每一列数据
  • [C#]使用C#部署yolov8-seg的实例分割的tensorrt模型
  • 写个删除obj文件夹、bin文件夹的小工具
  • 【多目标跟踪】《FlowMOT: 3D Multi-Object Tracking by Scene Flow Association》论文阅读笔记
  • python长方形周长面积 2024年3月青少年编程电子学会python编程等级考试二级真题解析
  • C#WPF数字大屏项目实战02--主窗体布局
  • 【STM32】STM32F103C6T6标准外设库
  • 【学习笔记】Windows GDI绘图(十一)Graphics详解(下)
  • win10环境下nodejs安装过程
  • 亚信安慧AntDB:卓越的拓展性和灵活性
  • 【计算机毕设】基于SpringBoot的中小企业设备管理系统设计与实现 - 源码免费(私信领取)
  • 每日一练 - BGP配置中的认证方法
  • 人机交互中的阴差阳错
  • 个人网站建设方案书
  • IIS7整合Tomcat9服务器,并搭建ASP+PHP+JSP完整运行环境
  • IT运维重难点剖析及应对策略
  • 【Python学习】面向对象(OOP)
  • 鸿蒙HarmonyOS实战—如何使用Video组件播放视频
  • 【Paddle2ONNX】为 Paddle2ONNX 升级自适应ONNX IR Version功能