Python win32com.client for Outlook:'Move' 功能将有限数量的电子邮件从收件箱移动到其他文件夹

Python win32com.client for Outlook : 'Move' function move limited number of emails from inbox to other folder

上下文: 我的 Oulook 收件箱中有 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)

问题: 程序 运行s 没有抛出任何错误,但仅移动了预期 100 封电子邮件中的 20 封电子邮件。如果我运行程序多次,它实现了一次移动20个。

尝试次数: 我在 windows API documentation 中搜索过,但没有找到有用的东西。

问题:知道是什么导致了这个限制以及如何避免它吗?

谢谢!

您在更改集合(通过移动消息)时循环访问集合 - 您不可避免地会跳过项目。

你需要一个从倒数到 1 的反向循环。

首先,我注意到以下几行代码:

for message in messages:
    if 'Target subject' in message.Subject:

遍历文件夹中的所有项目并检查主题行是否包含特定关键字确实不是一个好主意。相反,我建议使用 Items class 的 Find/FindNext or Restrict 方法。在以下文章中阅读有关这些方法的更多信息:

如果您仍然处理项目集合(在 Restrict 方法的情况下),您需要从末尾使用 for 循环遍历所有项目并调用 Move 方法如下:

for i in reversed(messages):
    i.Move(myFolder)