【问题标题】:Python win32com.client for Outlook : 'Move' function move limited number of emails from inbox to other folder适用于 Outlook 的 Python win32com.client:“移动”功能将有限数量的电子邮件从收件箱移动到其他文件夹
【发布时间】:2021-08-24 19:40:46
【问题描述】:

上下文:我的 Oulook 收件箱中有 100 封主题为 'Target subject <something>' 的电子邮件,我想将它们全部移到另一个文件夹中,比如 'MyFolder'。这是我的 python (version=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)

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

尝试:我在windows API documentation 中进行了搜索,但没有发现任何有用的信息。

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

谢谢!

【问题讨论】:

    标签: python-3.x email outlook move win32com


    【解决方案1】:

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

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

    遍历文件夹中的所有项目并检查主题行是否包含特定关键字确实不是一个好主意。相反,我建议使用Items 类的Find/FindNextRestrict 方法。在以下文章中详细了解这些方法:

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

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

    【讨论】:

    • 非常感谢资源!这是我第一次尝试使用 Windows API,文档不容易使用。稍后我会阅读并发布解决方案。
    • 我读过docs 它说:“没有办法执行“包含”操作[...]。相反,您可以使用AdvancedSearch method,或者您可以遍历文件夹中的所有项目,并使用 InStr 函数在字段中执行搜索。“我无法让 AdvancedSearch 工作。它会抛出一个com_error : 'Incorrect parameter,所以我想我将不得不做循环解决方案。
    • 我写了这样的代码:search = win32com.client.Dispatch("Outlook.Application").AdvancedSearch(inbox)
    • Advanced search in Outlook programmatically: C#, VB.NET如何在代码中使用AdvancedSearch
    【解决方案2】:

    您在更改集合的同时(通过移动消息)循环遍历集合 - 不可避免地会出现跳过的项目。

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

    【讨论】:

    • 感谢您的提示!稍后我会发布解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2010-12-27
    • 2017-05-20
    • 1970-01-01
    • 2021-12-21
    • 2021-03-09
    相关资源
    最近更新 更多