Exchange 邮件过滤器问题 Python

问题描述

我有一个脚本来列出来自 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)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...