当前位置: 首页 > 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

相关文章:

  • MySQL 高级 - 第十一章 | 索引优化与查询优化
  • 力扣 74.搜索二维矩阵
  • vue 将图片url转base64
  • 优化财务管理制度提升企业经营效益—以审计代理记账为例
  • JWT及单点登录实现
  • window.setInterval(func,interval)定时器
  • Java | Leetcode Java题解之第137题只出现一次的数字II
  • 高质量 HarmonyOS 权限管控流程
  • 尝试使用blazor(二)Blazor WebAssembly(WASM)与Server之间有什么区别?
  • Python | 洗盘子(栈)
  • 获得抖音商品评论 API 返回值
  • 一个例子了解c++的指针数组和数组指针
  • Linux网络编程——概念及实现双方聊天
  • mingw64,clang,gcc
  • C# Maui 报错:程序“[15748] MauiApp1.exe”已退出,返回值为 2147942405 (0x80070005)
  • hexo+github搭建个人博客
  • [case10]使用RSQL实现端到端的动态查询
  • 03Go 类型总结
  • 30天自制操作系统-2
  • CSS盒模型深入
  • Java到底能干嘛?
  • node学习系列之简单文件上传
  • python_bomb----数据类型总结
  • Redash本地开发环境搭建
  • uva 10370 Above Average
  • Vim Clutch | 面向脚踏板编程……
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 讲清楚之javascript作用域
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 正则与JS中的正则
  • ​Python 3 新特性:类型注解
  • #考研#计算机文化知识1(局域网及网络互联)
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (javaweb)Http协议
  • (PADS学习)第二章:原理图绘制 第一部分
  • (ZT)薛涌:谈贫说富
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (备忘)Java Map 遍历
  • (多级缓存)缓存同步
  • (分布式缓存)Redis持久化
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (剑指Offer)面试题34:丑数
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .md即markdown文件的基本常用编写语法