Ошибка «Не удалось создать кэшированный протокол с ключом ..» при попытке подключиться к учетной записи электронной почты Exchange с использованием python - PullRequest
0 голосов
/ 17 февраля 2020

Добрый день. У меня есть скрипт python, который проверяет почтовый ящик на наличие непрочитанных сообщений. Если есть непрочитанные сообщения с вложениями, то выполняется некоторый код (автоматизация Excel). Раньше он работал хорошо; однако сегодня я столкнулся с этой ошибкой при выполнении скрипта:

Не удалось создать кэшированный протокол с ключом ('******** / EWS / Exc hange.asmx', Credentials ('* ****** ',' ******** ')): HTTPSConnectio nPool (host =' ******* ', port = 443): максимальное количество попыток превышено с помощью url: / EW S /Exchange.asmx (вызвано SSLError (SSLCertVerificationError ("имя_хоста" mail.example.com "не соответствует ни из" * .example.com "," example.com "))))

Где example.com - сервер компании.

Я искал некоторые ответы и столкнулся с рекламой, в которой говорилось, что я должен установить Veryfy-ssl в False (учетная запись). Когда я это делаю, я больше не получаю сообщение об ошибке из командной строки, но скрипт просто завершается в 1 се c и ничего не делает.

В чем может быть проблема? Я не сделал никаких изменений в коде, так это вина почтового сервера? Ниже приведен фрагмент кода, который получает вложение от почты:

def get_attachments(login, password, path):
    files_list = []
    credentials = Credentials(
    username=login,  
    password=password
    )
    config = Configuration(server=settings.server, credentials=credentials)
    account = Account(primary_smtp_address=login, 
    config=config, autodiscover=False, access_type=DELEGATE)
    unread = account.inbox.filter(is_read=False) 
    attachment_counter = 0
    for msg in unread:
        msg.is_read = True
        msg.save()
        for attachment in msg.attachments:
            fpath = os.path.join(path, attachment.name)
            if os.path.exists(fpath):
                attachment_counter += 1
                fpath = os.path.join(path, (str(attachment_counter) + attachment.name))
            if attachment.name.split(".")[-1].lower() in ['xlsx', 'xls']:
                with open(fpath, 'wb') as f:
                   f.write(attachment.content)
                   files_list.append(fpath)
    return files_list

1 Ответ

0 голосов
/ 23 февраля 2020

Ошибка вызвана неверным сертификатом SSL, установленным на вашем сервере Exchange - сертификат недействителен для доменного имени, с которого он обслуживается. Вы можете отключить проверку SSL на свой страх и риск. Инструкции см. В https://github.com/ecederstrand/exchangelib/blob/master/README.md#proxies -and-custom-tls-validation .

Ваш скрипт не печатает никаких выходных данных, поэтому на самом деле невозможно узнать, работает ли он как предназначен или нет. На быстром сервере Exchange достаточно 1 секунды, чтобы проверить входящие сообщения на наличие непрочитанных писем. Может быть, у вас просто нет непрочитанных писем, или не было непрочитанных писем с вложениями Excel?

...