【问题标题】:python win32com bulk reading outlook emails - too many open itemspython win32com 批量阅读outlook邮件——打开的项目太多
【发布时间】:2019-02-17 05:17:08
【问题描述】:

我在尝试通过 python wincom32.client 获取批量邮件时遇到了一些问题。

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

这是我的代码 sn-p - 我知道它很丑 - 但我在 jupiter notebook 上使用它只是为了在正确安排之前进行试验/玩耍。

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, '发生异常。', (4096, 'Microsoft Outlook', '您的服务器管理员已限制项目数量 您可以同时打开。尝试关闭您打开的消息或 从您的未发送邮件中删除附件和图像 组成。',无,0,-2147220731),无)。

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

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

感谢任何人的想法/建议/无论如何。

【问题讨论】:

  • 你的代码处理这些项目是什么?要记住的一件事是,您应该避免使用“foreach”循环,因为它们会使所有枚举项保持打开状态,直到循环退出。
  • @DmitryStreblechenko 我正在做的唯一处理是收集项目字段,如图所示 - 我想将整个列表存储在 pandas 数据框中以执行进一步的操作。

标签: python outlook exchange-server win32com mapi


【解决方案1】:

您将文件夹中的所有项保持打开状态 - 这是一个非常糟糕的主意。仅存储条目 ID,并使用 Namespace.GetItemFromID 按需重新打开消息。完成项目后,立即释放它。

【讨论】:

  • 谢谢,但正如您在我自己的回答中看到的那样,我找到了真正的原因。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

首先感谢 Equinox23 的回答。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多