2 回答
TA贡献1783条经验 获得超4个赞
尝试将“ for
”循环替换为从 1 到 Items.Count 的循环(使用 Items(i) 检索项目) - 不确定 Python,但在其他语言中,“ ”foreach
循环倾向于保留引用的集合的所有项目,直到循环退出。
TA贡献1802条经验 获得超5个赞
我的解决方案是不将所有电子邮件(MailItem 对象)存储在列表中。如果我需要列表中的电子邮件,当我处理电子邮件时,我应该list.pop()立即将其从列表中删除。使用PropertyAccessor并将电子邮件保留在列表中会导致 Outlook 将对象保留在内存中,并导致 Outlook 内存不足。
我摆脱了get_emails和get_emails_and_ids函数并重新编写了该get_email_ids函数以仅存储电子邮件消息 ID,但不将电子邮件对象存储在列表中:
def get_email_ids(folder) -> Tuple[Set[str], int]:
email_ids = set()
items = folder.Items
i = 0
for item in items:
if "_MailItem" in str(type(item)):
i += 1
property_accessor = item.PropertyAccessor
email_id = property_accessor.GetProperty(PidTagInternetMessageId)
if len(email_id) > 0:
email_ids.add(email_id)
if i % 500 == 0:
print(f" Retrieved {i} email IDs.")
return email_ids, i
我编写的另一个脚本现在快了很多,至少需要 10 分钟。以前,它每秒处理几封电子邮件,需要几个小时。
添加回答
举报