python - win32com + Outlook 每次执行仅捕获收件箱中 50% 的邮件

标签 python python-3.x outlook automation win32com

我使用 win32com 和 Python 3.x 创建了一些代码,它只是通过 Outlook文件夹并对里面的消息进行处理(移动它们、阅读它们等)。

它工作完美,除了一个奇怪的小问题......文件夹中只有 50% 的项目正在处理!收件箱中有 500 件元素?分析了 250 个。 30?收件箱中剩余 15 封。 1?处理没有问题。

如果我使用“messages.Count”,我可以看到邮箱中有多少封电子邮件 - 该数字与我在 Outlook 中看到的数字相符。无论如何,当看到一半的项目时,程序就会结束。该程序将倒计时 30、29、28...到 15 时停止,不会抛出任何错误。

如果我稍微玩一下循环,执行 while messages:,程序将倒数到 15,然后给我一个“NoneType”异常,向我表明 Outlook 不是“尽管邮箱中存在一些消息,但仍向 python 发送更多消息。

在这两种情况下再次运行程序只会处理剩余的 50% 消息。

这是怎么回事?这是 Outlook 的事情吗?我什至不知道从哪里开始......这是代码的 super 精简版本。即使在这个级别,该错误仍然存​​在。收件箱的 50% 被移动,50% 保留。剩下的 50% 中,一半会在下次执行时处理。

    import win32com.client

    outlook = win32com.client.Dispatch("Outlook.Application")
    namespace = outlook.GetNamespace("MAPI")
    root_folder = namespace.Folders.Item(1) # Choose account
    subfolder = root_folder.Folders['Inbox'] # Choose folder, subfolder
    subfolderO = root_folder.Folders['Inbox'].Folders['Closed'] # Choose folder, subfolder
    messages = subfolder.Items
    message = messages.GetFirst()

    for message in messages:
        print("\n", message.Sender, "\n", message.To, "\n ", message.Subject',"\n", message.CreationTime, "\n_________")
        message.Move(subfolderO)
        message = messages.GetNext()

最佳答案

主要问题是您在迭代消息时修改消息:

message.Move(subfolderO)

这并不明显,但这会修改​​消息。循环将缩小 1,但迭代器不会向后移动,因此您会错过容器中的下一项。

这是许多语言和容器实现中的常见问题。

所以不要这样做。

一种方法是制作容器的副本并对其进行迭代,同时修改原始容器。

for message in list(messages):
    ...
    message.Move(subfolderO)

此外,您不需要这样做:

    message = messages.GetNext()

关于python - win32com + Outlook 每次执行仅捕获收件箱中 50% 的邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42633912/

相关文章:

python - Itertools.product 引发 "Error in argument"

c# - 访问 Outlook Exchange 全局地址簿

azure - 来自 powershell 的 Outlook Rest-API 返回誓言请求 (401)

php - 使用 X/Gui-less linux 生成网页的图像/缩略图

python - 如何将值为 True 的数据存储中的所有属性移动到另一个数据存储?

python - 宽数据的摘要统计

vba - Excel vba Items.restrict 2 条件

python - 将数组列表发送到 For 循环

python - 安装scrapy时出现gcc失败错误

python - Seaborn:线图看起来像阶梯图