首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python :删除Outlook中的多封电子邮件

python :删除Outlook中的多封电子邮件
EN

Stack Overflow用户
提问于 2018-11-28 16:24:42
回答 6查看 6.9K关注 0票数 2

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

我知道win32com通过COM可以使用VBA方法MailItem.Delete(),但是删除不止一封电子邮件的速度非常慢,因为必须按顺序删除电子邮件,即在MailItem电子邮件集合上依次删除电子邮件。

是否有任何方法可以立即删除选定的mailItems集合,比如MailItemCollection.DeleteAll()?

另外,如果上面不可能,是否有可能通过多线程方法删除许多电子邮件--例如,将mailItems的集合划分为4个子集;是否有4个线程对这些子集进行操作?

我想,由于我可以删除多个电子邮件的outlook通过它的GUI非常快,必须有一个方法,我可以做同样的事情通过COM API。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-11-28 16:44:59

不是在OOM - MailItem.DeleteItems.Remove(Index)是你得到的全部.

在扩展的MAPI级别(C++或Delphi,但不是Python)上,您可以使用IMAPIFolder.DeleteMessages删除多条消息(其中包含条目ids的列表)。也可以使用IMAPIFolder.EmptyFolder (删除文件夹中的所有消息)。

如果使用赎罪 (任何语言;我是它的作者)是一种选择,则可以使用RDOFolder2.EmptyFolderRDOFolder2。如果将RDOFolderMAPIFolder对象作为参数传递,则可以从RDOSession.GetRDOObjectFromOutlookObject检索。

票数 3
EN

Stack Overflow用户

发布于 2019-01-20 00:55:02

除了@Dimitry的一个很好的答案之外,我还会添加一句对您来说可能很重要的话:如果您在迭代时开始删除条目,那么可能会发生奇怪的事情。例如,在我的系统中,下面的Python代码:

代码语言:javascript
复制
for mail in folder.Items:
    mail.Delete()

以及

代码语言:javascript
复制
for index, mail in enumerate(folder.Items, 1):
    folder.Remove(index)

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

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

代码语言:javascript
复制
for i in range(len(folder.Items)):
    folder.Remove(1)

如果需要按照特定的标准进行筛选,请考虑首先收集EntryIDs,然后删除对ID的搜索:

代码语言:javascript
复制
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()

不过,我认为这方面的表现甚至更糟:

票数 2
EN

Stack Overflow用户

发布于 2019-05-15 17:51:11

以上是来自底达勒斯的伟大回答。想要制作一个更简洁的代码版本:

代码语言:javascript
复制
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

您可能不需要两个“尝试”,但我发现当将脚本应用到一个长而大量使用的收件箱时,它更稳定。通常,我会结合一个脚本,将message = inbox.Items限制在一周内,这样它就不会完成整个收件箱的工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53523943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档