问题描述
我有一个脚本来列出来自 Exchange 帐户的电子邮件,但收到回复需要很长时间,有时我会收到类似的错误。
EXCEPTION IN (<string>,L_203 ""): HTTPSConnectionPool(host='outlook.office365.com',port=443): Read timed out.
或
requests.exceptions.ChunkedEncodingError: ("Connection broken: ConnectionResetError(10054,'Se ha forzado la interrupción de una conexión existente por el host remoto',None,10054,None)",ConnectionResetError(10054,None))
我不明白为什么要花这么长时间。我的帐户会不会有问题?有时最多需要 2 分钟才能给出错误
这是我的代码的一部分:
class ExchangeModule:
def __init__(self,user_,pwd,server_,mail_):
self.pwd = pwd
self.mail = mail_
self.server = server_
self.user = user_
self.credentials = None
self.config = None
def init(self):
from exchangelib import Credentials,Configuration
self.credentials = Credentials(username=self.user,password=self.pwd)
self.config = Configuration(server=self.server,credentials=self.credentials)
return self.config
if module == "exchange":
user = GetParams('user')
password = GetParams('pass')
server = GetParams('server')
address = GetParams('address')
print('USUARIO',user)
exchange_module = ExchangeModule(user,password,server,address)
config = exchange_module.init()
if module == "get_new_mail":
if exchange_module.config is not None:
config = exchange_module.config
else:
raise Exception("Execute Email Configuration command")
address = exchange_module.mail
a = Account(primary_smtp_address=address,config=config,access_type=DELEGATE,autodiscover=False)
var = GetParams('var')
filter_type= GetParams('tipo_filtro')
filtro = GetParams('filtro')
id_ = []
if filtro:
if filter_type== 'author':
for m in a.inbox.all():
if not m.is_read and filtro in m.author.email_address:
id_.append(m.id)
if tipo_filtro == 'subject':
mails_filters = a.inbox.filter(subject__contains=filtro)
for m in mails_filters:
if not m.is_read:
id_.append(m.id)
# print('FOR',m.id)
else:
id_ = [m.id for m in a.inbox.all() if not m.is_read]
SetVar(var,id_)
解决方法
如果您在 exchangelib 中启用调试日志记录(请参阅 https://ecederstrand.github.io/exchangelib/#troubleshooting),您可以确切地看到发生了什么。
您的脚本正在获取所有 项字段,即使它确实只需要 id
字段。这是非常繁重的,因为您还要获取完整的正文、附件等。此外,它正在过滤客户端的项目,而这些项目也可能在服务器端过滤,从而为您提供更少的数据传输。而不是:
for m in a.inbox.all():
if not m.is_read and filtro in m.author.email_address:
id_.append(m.id)
做
for m in a.inbox.filter(is_read=True,author__contains=filtro).only('id'):
id_.append(m.id)
而不是:
mails_filters = a.inbox.filter(subject__contains=filtro)
for m in mails_filters:
if not m.is_read:
id_.append(m.id)
做
for m in a.inbox.filter(subject__contains=filtro,is_read=True).only('id'):
id_.append(m.id)
除此之外,您可能只是互联网连接速度较慢。如果您想隐藏这些错误并让您的脚本重试,您可以配置容错 (https://ecederstrand.github.io/exchangelib/#fault-tolerance)。