【问题标题】:Exchange mail filter problems PythonExchange邮件过滤问题Python
【发布时间】:2021-05-13 12:39:18
【问题描述】:

我有一个脚本来列出来自 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, 'Se ha forzado la interrupción de una conexión existente por el host remoto', None, 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_)

【问题讨论】:

    标签: python exchange-server exchangelib


    【解决方案1】:

    如果您在 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)。

    【讨论】:

    • Esa es la solución, obtener solo los valores que interesan, que en mi caso es el id。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2011-02-06
    • 2015-07-28
    • 1970-01-01
    • 2015-08-10
    • 2021-11-28
    • 2010-10-20
    相关资源
    最近更新 更多