python win32com:删除Ou中的多个电子邮件

2024-04-20 12:17:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要通过win32com模块从python删除Outlook中的多封电子邮件。在

我知道有一种VBA方法邮件项目。删除()可通过COM提供给win32com,它可以工作;但是当删除多个电子邮件时,速度非常慢,因为必须按顺序删除电子邮件,即在邮件的mailtime集合上循环。在

有没有什么方法可以一次删除选定的邮件集合,比如MailItemCollection.DeleteAll()? 在

另外,如果上面不可能,是否可以通过多线程方法删除许多电子邮件,例如将邮件项集合划分为4个子集;让4个线程处理这些邮件?在

我想既然我可以通过它的GUI快速删除outlook中的多封电子邮件,那么就必须有一种方法可以通过comapi来做同样的事情。在


Tags: 模块项目方法com顺序电子邮件邮件vba
3条回答

上面德达鲁斯的回答很好。想让代码更简洁:

import win32com.client

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

# Select main Inbox
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items

# Delete all messages from a specific sender
sender = 'myname@abc.com'
try:
    for message in messages:
        try:
            s = message.sender
            s = str(s)
            if s == sender:
                 message.Delete()
        except:
            pass
except:
    pass

你可能不需要两个“try”,但我发现当你把这个脚本应用到一个长时间且频繁使用的收件箱时,它会更加稳定。通常,我将其与限制消息的脚本相结合收件箱。项目在一周之内,这样就不会处理整个收件箱。在

不在OOM中-MailItem.DeleteItems.Remove(Index)就是你所能得到的。在

扩展的MAPI级别(C++或Delphi,但不是Python),可以使用IMAPIFolder.DeleteMessages(它取入口ID列表)删除多个消息。或者可以使用IMAPIFolder.EmptyFolder(删除文件夹中的所有邮件)。在

如果可以选择使用Redemption(任何语言,我是其作者),那么可以使用RDOFolder2.EmptyFolder或{a5}.Items.RemoveMultipleRDOFolder可以从RDOSession.GetRDOObjectFromOutlookObject检索,如果您将Outlook的MAPIFolder对象作为参数传递。在

在@Dimitry给出的一个很好的答案的基础上,我将添加一条可能对您很重要的注释:如果您在迭代时开始从条目中删除,可能会发生奇怪的事情。 例如,在我的系统中,以下Python代码:

for mail in folder.Items:
    mail.Delete()

以及

^{pr2}$

两者都只删除folder中的一半项!原因似乎是Items在内部使用一系列索引来提供迭代器,因此每次删除元素时,列表的尾部都会移动一个。。。在

要删除文件夹中的所有项目,请尝试:

for i in range(len(folder.Items)):
    folder.Remove(1)

如果需要按特定条件筛选,请考虑先收集entryid,然后删除搜索ID:

ids = []
for i in range(len(folder.Items), 1):
    if to_be_deleted(folder.Items[index]):
        ids.append(index)
for id in ids:
    outlook.GetEntryByID(id).Delete()

不过,我想它的表现会更糟

相关问题 更多 >