上下文:我的outlook收件箱中有100封邮件,主题为'Target subject <something>'
,我想将它们全部移动到另一个文件夹中,假设为'MyFolder'
。下面是我的python(版本=3.9.6)程序:
import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
root_folder = outlook.Folders.Item(1)
inbox = outlook.GetDefaultFolder(6)
myfolder = root_folder.Folders['MyFolder']
messages = inbox.Items
for message in messages:
if 'Target subject' in message.Subject:
message.Move(myfolder)
问题:该程序运行时不会抛出任何错误,但只有20封电子邮件被移动。如果我运行这个程序几次,它可以一次移动20个。
尝试:我已经搜索了windows API文档,但没有发现任何有用的。
问题:你知道是什么导致了这种限制以及如何避免它吗?
谢谢!
首先,我注意到以下几行代码:
for message in messages:
if 'Target subject' in message.Subject:
遍历文件夹中的所有项目并检查主题行是否包含特定的关键字,这确实不是一个好主意。相反,我建议使用Items
类的Find/FindNext或Restrict方法。在以下文章中阅读更多关于这些方法的信息:
- 如何:使用Find和FindNext方法从文件夹中检索Outlook邮件项目(c#, VB.NET)
- 如何:使用Restrict方法从文件夹 中检索Outlook邮件项目
如果您仍然处理项目的集合(在Restrict
方法的情况下),您需要从末尾使用for
循环遍历所有项目,并以以下方式调用Move
方法:
for i in reversed(messages):
i.Move(myFolder)
在更改集合时(通过移动消息)正在循环-不可避免地会以跳过的项结束。
你需要从Count down到1的反向循环。