python win32com 批量阅读 outlook 电子邮件 - 未清项太多

python win32com bulk reading outlook emails - too many open items

我在尝试通过 python wincom32.client.

获取大量邮件时遇到了一些问题

基本上,在单个会话中可以打开的项目数量似乎有限制,这是服务器端标志或状态.. 问题是我没有找到 resume/close/re-set 的任何方法,我不能要求系统管理员为我做这件事..

这是我的代码片段 - 我知道它很丑陋 - 但我在 jupiter notebook 上使用它只是为了 experiment/play 在正确安排它之前。

import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

def create_message_list(folder):
    return [{
        "folder": folder.Name,
        "sender" : m.Sender,
        "recipients" : m.Recipients,
        "subject" : m.subject, 
        "body":m.body
        } for m in folder.Items]

for folder in outlook.Folders:
    if (folder.Name=="myfolder.name"):
        message_list = create_message_list(folder)

这是我得到的:

com_error: (-2147352567, 'Exception occurred.', (4096, 'Microsoft Outlook', 'Your server administrator has limited the number of items you can open simultaneously. Try closing messages you have opened or removing attachments and images from unsent messages you are composing.', None, 0, -2147220731), None).

请注意,我 让我的草图代码工作了一段时间 。在出现该错误之前,我可以获取 10k 条消息之类的东西。

我一直在尝试的事情(没有结果) - 尝试关闭文件夹/mapi 会话 - 运行 对相同项目的 for 循环并调用 message.Close(0) - 在消息上使用 GetFirst() / GetLast() 方法而不是列表理解

感谢任何人ideas/suggestions/whatever。

您将 所有 项保存在一个文件夹中打开 - 这真是个坏主意。仅存储条目 ID,并使用 Namespace.GetItemFromID 根据需要重新打开消息。完成项目后,立即释放它。

问题是由于使用字典来存储以某种方式引用它的消息数据,没有让资源被释放,即使调用了显式 m.Close(0)

我已将它们全部替换为 "dictkey" : str(m.<field>) 调用,错误不再出现。

首先感谢 Equinox23 的回答。

只是想再补充几点。在访问 outlook 电子邮件包时,同样的事情发生在我身上。考虑 list1list2,每次迭代我都会得到输出 list1,最后,将其附加到 list2 并重置 list1。经过 230 多次迭代后,我得到了同样的错误。在这里,list2 参考了 list1,正如 Equinox23 提到的那样,不允许我们一次打开多个项目。

因此,我没有直接将 list1 附加到 list2(如 list2.append(list1)),而是按照 Equinox23 提到的方式执行了以下操作 (list2.append(str(list1))) [使用适当的数据类型喜欢 str(list1)/int(list1) 并附加它]。

您可以消除错误并获得所需的输出。