Outlook 使用 python win32com 迭代子文件夹

Outlook using python win32com to iterate subfolders

我有以下代码可以获取共享文件夹的收件箱以及其中的所有电子邮件。此代码效果很好,将打印最后一封电子邮件的主题。

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 邮箱中的其他父文件夹(如已发送),但我无法获取收件箱内或更深文件夹的任何子文件夹。那么,如果我想要 inbox\subfolder1,我该如何访问它?如果重要,请使用 Outlook 2013。 我的主要目标是:

message.Move(inbox\subfolder1)

这是我用来执行类似任务的代码。

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

这会在文件夹 "All/Main Folder/Subfolder" 中找到邮件。

不能这样做 - Outlook 缓存主 OST 文件中的共享默认文件夹 不缓存子文件夹。如果有问题的邮箱被添加为委托存储,您应该能够使用 Namespace.FoldersNamespace.Stores.

解析到有问题的文件夹

否则你可以使用Redemption (I am its author) and its RDOSession.GetSharedDefaultFolder - the folder will be opened in the online mode with all of its subfolders (RDOFolder.Folders).

我采纳了 Jared Goguen 的回答并进行了修改。

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

其中 inbox.Folders(6) 使用我感兴趣的子文件夹的索引来识别它。我能够使用此消息成功地遍历子文件夹中的消息。

是的最好写成文件夹的名字而不是写文件夹编号

比如我的文件夹层次结构是: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)

特斯拉爵士。 实际上,我遵循了您的代码模式并根据我当前的项目对其进行了更改。 请找到下面的样本代码。

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[]下即可顺其自然。

Tesla 爵士 你的代码模式对我很有帮助,而不是使用 文件夹编号

另一方面,这项技术帮助我在特定时间范围内附加邮件阅读和采取行动。

import win32com.client as win32

# new outlook object
outlook = win32.Dispatch("Outlook.Application")

# get user namespace *Important when reading email*
namespace = outlook.GetNamespace("MAPI")

# Default inbox folder either Folders.Item(1/2)
root_folder = namespace.Folders.Item(2)

# Use this function to display subfolders inside the current folder

def menu(outlookFolderItem):
    for i in range(0,20):
        try:
            print(i,outlookFolderItem.Folders(i).Name)
        except:
            pass

# example
menu(root_folder)

# navigate into the subfile by

sub_folder = root_folder.Folders(2).Folders(14)
def processfolder(folder):

    ignoredfolders = []
    
    if not folder.Name in ignoredfolders:
        print("processing", folder.Name)
        count=0
        for mail in folder.Items:
               savemsg(mail)
               count += 1

        print(count, "Mails in folder")
        for fld in folder.Folders:
            processfolder(fld)