Выполните поиск по всему почтовому ящику Outlook для конкретных писем с помощью Python

#python #outlook #win32com

Вопрос:

Моя цель-выполнить поиск по всему почтовому ящику Outlook, чтобы найти/извлечь электронные письма с определенной темой.

Мой код выглядит следующим образом:

 import win32com.client
import os
import re

path = 'C:/working path'
os.chdir(path)

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

user = outlook.Application.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress

inbox = outlook.Folders[user].Folders["Inbox"]


for i in inbox.Folders:
    subfolders = i.Items
    print(i.name)
    for message in subfolders:
        if message.subject.startswith('Report on X'):
            print(message.subject)
            title = str(message.subject)
            message.SaveAs(os.getcwd()   '//'   title   '.msg')
        else:
            print('skipped')
 

Моя проблема в том, что у меня есть сообщения на разных уровнях папок. Другими словами, у меня есть папки, подпапки, подпапки … и так далее.

С помощью приведенного выше кода я могу получить доступ только к папке «Входящие» и только к ее вложенным папкам. Поэтому, если электронное письмо, которое я ищу, находится во вложенной папке, я не могу его найти.

Есть ли способ выполнить поиск по всему почтовому ящику Outlook без указания имен папок, вложенных папок и т.д. ?

Ответ №1:

Я рекомендую вам взглянуть на это .Поле Папки. Прямо сейчас вы получаете доступ только к значению «Входящие» этого поля, но я бы предположил, что у него есть доступ ко всем другим папкам. Например:

 print(inbox = outlook.Folders[user].Folders)
 

Если при этом отображается массив всех папок, то вы можете просто просмотреть каждую папку в этом массиве.

 for i in outlook.Folders[user].Folders.Folders:
    subfolders = i.Items
    print(i.name)
    for message in subfolders:
        if message.subject.startswith('Report on X'):
            print(message.subject)
            title = str(message.subject)
            message.SaveAs(os.getcwd()   '//'   title   '.msg')
        else:
            print('skipped')