2016-11-28 156 views
2

我有以下代码可以将我的共享文件夹的收件箱和里面的所有电子邮件发送给我。此代码很好,并会打印最后一封电子邮件的主题。使用python win32com展开迭代子文件夹的Outlook

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.FoldersNamespace.Stores解析相关文件夹。

否则,您可以使用Redemption及其RDOSessionGetSharedDefaultFolder - 该文件夹将以在线模式及其所有子文件夹(RDOFolderFolders)打开。

+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 

这会在文件夹“All/Main Folder/Subfolder”中找到消息。

+0

我喜欢这个想法,但你知道如何得到它的共享邮箱工作?我尝试从我的初始代码设置root_folder等于outlook.GetSharedDefaultFolder(recip,6),但没有运气。 – nico

+0

@nico随着这种变化'root_folder'有一个'文件夹'属性?看来这样会将收件箱设置为'root_folder',这样子文件夹就可以通过'root_folder.Folders ['Subfolder']找到。如果没有,我不知道,对不起。 –

+0

尽管'GetSharedDefaultFolder'应该返回一个'Folder',可以在这里找到API:[Folder API](https://msdn.microsoft.com/en-us/library/office/ff863890.aspx)。 –

-1

我拿了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)使用我的利益,以确定它的子文件夹的索引。我能够使用此消息成功地遍历子文件夹中的消息。

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-c​​an- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/18894815) – NightOwl888

相关问题