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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:21:02