使用 exchangelib 从日历请求数据时出现问题

Problem when requesting data from the calendar using exchangelib

我正在尝试使用官方文档中几乎未更改的代码来读取相当大的日历。

from exchangelib import DELEGATE, Account, Credentials, CalendarItem, close_connections
from exchangelib.protocol import BaseProtocol
credentials = Credentials(
    username='username',  
    password='password'
)
account = Account(
    primary_smtp_address='address', 
    credentials=credentials, 
    autodiscover=True,
    access_type=DELEGATE)
    
a = account

for calendar_item in a.calendar.all():
    print('--------------------------')
    print(calendar_item.organizer, calendar_item.start)

account.protocol.close()

同时,脚本的第一分钟什么也没有发生。那么几百行输出就是我需要的输出。之后,脚本因超时而停止,并出现以下错误: 提高 self._get_exception(code=response_code, text=msg_text, msg_xml=msg_xml) exchangelib.errors.ErrorTimeoutExpired: 请求超时

我能否以某种方式增加超时或更改请求以使其运行更快?

第一分钟脚本没有空闲。如果你 enable debug logging, you'll most likely see that it's autodiscovery that's taking a long time. You can cache autodiscover results 并在下次 运行 脚本时使用它们,如果你想缩短启动时间。

至少有三种方法可以解决您的问题(甚至可以结合使用):

  1. 创建超时。设置例如。 BaseProtocol.TIMEOUT = 600
  2. 减少获取的数据量。而不是a.calendar.all(),做a.calendar.all().only('organizer', 'start')
  3. 配置 retry policy 让 exchangelib 在遇到超时错误时重试。