2016-11-28 5 views
2

У меня есть следующий код, который доставит мне почтовый ящик моей общей папки и все электронные письма внутри. Этот код отлично работает и напечатает тему последнего письма.Outlook с использованием python win32com для итерации вложенных папок

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") 
recip = outlook.CreateRecipient("[email protected]") 
inbox = outlook.GetSharedDefaultFolder(recip, 6) 
messages = inbox.Items 
message = messages.GetLast() 
print (message.Subject) 

я могу получить доступ к другим родительским папкам в почтовом ящике [email protected]'s (как Отправленные), но я не могу получить любые вложенные папки в почтовом ящике, или глубже, чем это. Итак, если я хочу inbox \ subfolder1, как мне получить доступ к этому? Использование Outlook 2013, если это имеет значение. Моя главная цель состоит в том, чтобы сделать:

message.Move(inbox\subfolder1) 

ответ

3

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

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

+0

Хорошо штопать. Это отстой. Спасибо за понимание. К сожалению, я ограничена тем, какие инструменты я могу использовать, поэтому я пытался найти способ сделать это с помощью только Python. – nico

3

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

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 

Это находит сообщения в папке «Все/Основная папка/Подпапка».

+0

Мне очень нравится эта идея, но знаете ли вы, как заставить ее работать с общим почтовым ящиком? Я попробовал установить root_folder равным outlook.GetSharedDefaultFolder (recip, 6) из моего исходного кода, но не повезло. – nico

+0

@nico С этим изменением у 'root_folder' есть свойство' Folders'? Похоже, это установит почтовый ящик как 'root_folder', поэтому вложенную папку можно найти с помощью' root_folder.Folders ['Subfolder'] '. Если нет, я понятия не имею, извините. –

+0

Хотя GetSharedDefaultFolder должен вернуть API-интерфейс 'Folder', который можно найти здесь: [API-интерфейс папки] (https://msdn.microsoft.com/en-us/library/office/ff863890.aspx). –

-1

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

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

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

2

Да, его лучше записать его в качестве имени папки вместо того, чтобы писать номера папок

Как моя иерархия папок: 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) 
0

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

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> 

Здесь я узнал, одно. Когда нам нужно выполнить какой-то вид Функциональные почтовые ящики, тогда нам просто нужно указать имя под mapi.Folder [], а затем просто пойти с потоком.

Сэр Тесла ваш шаблон кода был полезен для меня, вместо того, чтобы использовать номер папки.

С другой стороны, эта методика помогает мне добавлять почту, считывая &, принимая меры в течение определенного периода времени.

+0

Если у вас есть новый вопрос, обратитесь к нему, нажав кнопку [Ask Question] (https://stackoverflow.com/questions/ask). Включите ссылку на этот вопрос, если это поможет обеспечить контекст. - [Из обзора] (/ review/low-quality-posts/18894815) – Shikkediel

+0

Пожалуйста, не добавляйте «спасибо» в качестве ответа. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [проголосовать за вопросы и ответы] (https://stackoverflow.com/help/privileges/vote-), которые вы нашли полезными. - [Из обзора] (/ review/low-quality-posts/18894815) – WebDevBooster

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (https://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/18894815) – NightOwl888