Outlook использует python win32com для итерации вложенных папок

у меня есть следующий код, который возвращает меня в мой почтовый ящик общей папки и все письма внутри. Этот код отлично работает и будет печатать тему последнего письма.

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
recip = outlook.CreateRecipient("foo@bar.com")
inbox = outlook.GetSharedDefaultFolder(recip, 6)
messages = inbox.Items
message = messages.GetLast()
print (message.Subject)

Я могу получить доступ к другим родительским папкам в foo@bar.com почтовый ящик (например, отправлен), но я не могу получить подпапки папки в папке "Входящие" или глубже. Итак, если я хочу inboxsubfolder1, как мне получить доступ к этому? С помощью Outlook 2013, Если это имеет значение. Моя главная цель-сделать:

message.Move(inboxsubfolder1)

5 ответов


не могу этого сделать - Outlook кэширует общие папки по умолчанию в основном OST-файле вложенные папки не кэшируются. Если рассматриваемый почтовый ящик добавлен в качестве хранилища делегатов, вы сможете проанализировать его с помощью Namespace.Folders или Namespace.Stores.

в противном случае вы можете использовать Искупление и RDOSession.GetSharedDefaultFolder - папка будет открыта в режиме online со всеми вложенными папками (RDOFolder.Folders).


да, лучше написать его как имя папки, а не писать номера папок

как моя иерархия папок: Outlook_Mails > входящие > важно

outlook = win32.com.client.Dispatch("Outlook.Application")
mapi = outlook.GetNamespace("MAPI")

your_folder = mapi.Folders['Outlook_Mails'].Folders['Inbox'].Folders['Important']
for message in your_folder.Items:
    print(message.Subject)

Это код, который я использую для выполнения аналогичной задачи.

outlook = win32com.client.Dispatch("Outlook.Application")
namespace = outlook.GetNamespace("MAPI")
root_folder = namespace.Folders.Item(1)
subfolder = root_folder.Folders['All'].Folders['Main Folder'].Folders['Subfolder']
messages = subfolder.Items

это находит сообщения в папке "Все/папка/подпапка".


Сэр Тесла. На самом деле, я следил за вашим шаблоном кода и изменил его в соответствии с моим текущим проектом. Пожалуйста найдите внизу код образца.

import win32com.client
outlook = win32com.client.Dispatch("Outlook.application")
mapi = outlook.GetNamespace("MAPI")
FirstFMB = mapi.Folders['FirstFMB'].Folders['Inbox']
SecondFMB = mapi.Folders['SecondFMB'].Folders['Another_folder']

<Hence other loops & operations as per requirement>

Я взял ответ Джареда Гогена и изменил его.

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
root_folder = inbox.Folders(6)
messages = root_folder.Items

здесь inbox.Folders(6) использует индекс интересующей меня подпапки для его идентификации. Я смог успешно выполнить итерацию сообщений в подпапке, используя это сообщение.