我在尝试通过python wincom32.client获取批量邮件时遇到了一些问题。
基本上,似乎对单个会话上可以打开的项目数量有限制,这是服务器端标志或状态..问题是我没有找到任何方式来恢复/关闭/重新设置,我不能要求系统管理员为我做这件事..
这是我的代码片段 - 我知道它很难看 - 但是我在木星笔记本上使用它只是为了试验/玩耍,然后正确地安排它。
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()方法消息而不是列表理解
感谢任何人的想法/建议/无论如何。
你将文件夹中的所有项目保持打开 - 这是一个非常糟糕的主意。仅存储条目ID,并使用Namespace.GetItemFromID
按需重新打开消息。完成该项目后,立即将其释放。
问题是由于使用字典来存储以某种方式保存的消息数据,而不释放资源,即使调用了明确的m.Close(0)
。
我用"dictkey" : str(m.<field>)
调用替换了它们,错误不再出现了。