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