Python ExchangeLib因backports.zoneinfo.ZoneInfo错误无法运行如何解决?
问题原因
报错触发的核心是exchangelib版本的时区兼容性问题:当前你使用的exchangelib版本中,from_pytz方法仅适配pytz库的时区对象,默认会调用对象的.zone属性取值。但你当前环境的本地时区自动获取逻辑返回的是backports.zoneinfo.ZoneInfo对象(Python3.9以下版本zoneinfo的兼容实现),该对象没有pytz特有的.zone属性,因此触发属性不存在的报错。
解决方案
可选择以下任意一种方案修复:
- 方案1:手动指定时区(最稳妥,无版本依赖)
初始化Account时手动传入default_timezone参数,跳过自动获取本地时区的逻辑,示例代码:from exchangelib import Credentials, Account, EWSTimeZone # 按实际所在时区替换即可,东八区为Asia/Shanghai custom_tz = EWSTimeZone('Asia/Shanghai') credentials = Credentials(self._from_user, self._password) account = Account( self._from_user, credentials=credentials, autodiscover=True, default_timezone=custom_tz ) - 方案2:升级exchangelib到最新稳定版
高版本exchangelib已经完成了zoneinfo类型的兼容适配,直接执行升级命令即可:pip install --upgrade exchangelib - 方案3:强制指定时区实现为pytz
初始化Account前添加配置,指定exchangelib使用pytz作为时区 provider,需先安装pytz:import exchangelib.ewsdatetime exchangelib.ewsdatetime.timezone_provider = 'pytz'
替代实现方案
如果无需使用Exchange协议的特殊功能,也可以直接通过SMTP协议连接Outlook服务发送邮件,示例代码:
import smtplib from email.mime.text import MIMEText from email.header import Header sender = "你的Outlook邮箱地址" password = "你的邮箱密码/应用授权码" receiver = "收件人邮箱地址" # 构造邮件内容 msg = MIMEText("邮件正文内容", "plain", "utf-8") msg["From"] = Header(f"发件人名称 <{sender}>") msg["To"] = Header(f"收件人名称 <{receiver}>") msg["Subject"] = Header("邮件主题", "utf-8") # 连接Outlook SMTP服务发信 with smtplib.SMTP("smtp.office365.com", 587) as smtp: smtp.starttls() smtp.login(sender, password) smtp.sendmail(sender, receiver, msg.as_string())
内容的提问来源于stack exchange,提问作者Aaditya R Krishnan
相关产品推荐
相关产品推荐

