(4096, «Microsoft Outlook», «Попытка выполнить операцию не удалась. Не удалось найти объект.’, Нет, 0, -2147221233), Нет) — ошибка в outlook

#python #outlook

Вопрос:

В настоящее время я работаю над перемещением писем в определенную папку в Outlook с помощью pywin32.com библиотека python. Я должен настроить путь к папке, и поэтому я создал файл python, в котором я сохраняю путь к папке в виде списка. Содержание FoldersConfig.py файл является:

#имена папок относительно папки «Входящие»

 mailBox = "mailbox-name"
nagiosDestinationFolder = ["Resolved_Clients","Internal","Nagios alerts"] #all these folders are been created in outlook with exact names.
 

Затем есть еще один файл для перемещения почты в папку назначения. В моем случае Nagios alerts — это моя папка назначения. Фрагмент кода MoveNagiosAlerts.py файл является:

 outlook = client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    stores = outlook.Stores
    for store in stores:
        mailBox = FoldersConfig.mailBox
        if(mailBox in store.DisplayName):
            rootFolder = store.GetDefaultFolder(6) #rootFolder is the Inbox folder
            break 
    
    def moveWarnings():
        print("Moving warning mails...")
        warnCount = 0
        scriptingDictionary = {}
        nagiosDestFolder = rootFolder
        for i in FoldersConfig.nagiosDestinationFolder:
            nagiosDestFolder = nagiosDestFolder.Folders(i)
        print(nagiosDestFolder)
        for i in range(rootFolder.Items.Count-1,0,-1):
            msg = rootFolder.Items[i]
            if(msg.Body.find("State: WARNING") != -1):
               msg.Move(nagiosDestFolder)
               warnCount =1
        return warnCount
 

Ошибка, которая появляется при запуске MoveNagiosAlerts.py файл является:

 Root folder(Inbox):  Inbox
Moving warning mails..
Traceback (most recent call last):
  File "C:UsersDocumentsMoveNagiosAlerts.py", line 193, in <module>
    main()
  File "C:UsersDocumentsMoveNagiosAlerts.py", line 172, in main
    warningsCount = moveWarnings()
  File "C:UsersDocumentsMoveNagiosAlerts.py", line 56, in moveWarnings
    nagiosDestFolder = nagiosDestFolder.Folders(i)
  File "C:UsersAppDataLocalPackagesPythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0LocalCachelocal-packagesPython37site-packageswin32comclientdynamic.py", line 181, in __call__
     return self._get_good_object_(self._oleobj_.Invoke(*allArgs),self._olerepr_.defaultDispatchName,None)
pywintypes.com_error: (-2147352567, 'Exception occurred.', (4096, 'Microsoft Outlook', 'The attempted operation failed.  An object could not be found.', None, 0, -2147221233), None)
 

Структура папок Outlook для вашего рефренса

Мой вопрос в том, почему возникает эта ошибка?? Иногда это работает нормально, но в большинстве случаев возникает эта ошибка. Есть идеи, что именно не так в моем коде?? или это проблема перспективы?

Насколько я понимаю, я думаю, что клиент pywin не может получить папку, которая находится в списке. Но не уверен, что в этом причина.

Ответ №1:

Я заметил следующий цикл в коде:

 for i in range(rootFolder.Items.Count-1,0,-1):
            msg = rootFolder.Items[i]
 

При перемещении элементов количество элементов в коллекции уменьшается. Так что вам нужно быть готовым к этому.

Также, если вы хотите перемещать только элементы, соответствующие условию, вам необходимо использовать методы Find / FindNext или Restrict для получения таких элементов, и они перемещают их все без проверки каких-либо других свойств. Подробнее об этих методах читайте в следующих статьях:

Комментарии:

1. Спасибо, что нашли время и ответили на мой вопрос @Евгений Астафьев. «Корневая папка. Товары. Подсчет» принимает текущее количество элементов в папке «Входящие», если я не ошибаюсь. Эти две ссылки были очень полезны. Спасибо, что уделили мне время.