win32com + outlook只捕获每次执行收件箱中50%的邮件?

时间:2017-03-06 19:23:37

标签: python python-3.x outlook automation win32com

我已经用win32com和python3.x创建了一个小代码,它只是通过一个outlook文件夹并对内部的消息进行处理(移动它们,读取它们等)。

除了一个奇怪的小问题外,它完美无瑕......文件夹中只有50%的项目正在处理中!收件箱中有500件商品?分析250。 30? 15留在收件箱中。 1?处理没有问题。

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

如果我稍微玩一下循环,执行while messages:,程序将倒计时到15,然后给我一个" NoneType"例外,向我表明前景不是"给予"除了邮箱中存在某些消息之外,还有更多消息发送到python。

在其中任何一种情况下再次运行程序将只处理剩余的50%的消息。

知道这里发生了什么吗?这是展望吗?我甚至不知道从哪里开始......这是代码的超级剥离版本。即使在这个级别,错误仍然存​​在。移动了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()

2 个答案:

答案 0 :(得分:1)

主要问题是你在迭代时修改messages

message.Move(subfolderO)

这并不明显,但这会修改​​messages。循环将缩小一个,但你的迭代器不会向后移动,所以你错过了容器中的下一个项目。

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

所以不要这样做。

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

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

此外,您不需要这样做:

    message = messages.GetNext()

答案 1 :(得分:0)

我与完全相同的问题作斗争。迭代“ .Move”仅获取一半的邮件。彼得·伍德(Peter Wood)的解释有所帮助,尽管花了一些时间才解决了这个问题。.::)我相信以下修改后的代码会起作用:

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 list(messages):
    print("\n", message.Sender,"\n", message.To, "\n ", message.Subject',"\n", message.CreationTime, "\n_________")
    message.Move(subfolderO)
    messages = subfolder.Items
    message = messages.GetFirst()

进行迭代,使其仅移动第一项,并在每次迭代中修改原始消息类。