我需要通过win32com模块从python删除Outlook中的多个电子邮件。
我知道win32com通过COM可以使用VBA方法MailItem.Delete(),但是删除不止一封电子邮件的速度非常慢,因为必须按顺序删除电子邮件,即在MailItem电子邮件集合上依次删除电子邮件。
是否有任何方法可以立即删除选定的mailItems集合,比如MailItemCollection.DeleteAll()?
另外,如果上面不可能,是否有可能通过多线程方法删除许多电子邮件--例如,将mailItems的集合划分为4个子集;是否有4个线程对这些子集进行操作?
我想,由于我可以删除多个电子邮件的outlook通过它的GUI非常快,必须有一个方法,我可以做同样的事情通过COM API。
发布于 2018-11-28 16:44:59
不是在OOM - MailItem.Delete或Items.Remove(Index)是你得到的全部.
在扩展的MAPI级别(C++或Delphi,但不是Python)上,您可以使用IMAPIFolder.DeleteMessages删除多条消息(其中包含条目ids的列表)。也可以使用IMAPIFolder.EmptyFolder (删除文件夹中的所有消息)。
如果使用赎罪 (任何语言;我是它的作者)是一种选择,则可以使用RDOFolder2.EmptyFolder或RDOFolder2。如果将RDOFolder的MAPIFolder对象作为参数传递,则可以从RDOSession.GetRDOObjectFromOutlookObject检索。
发布于 2019-01-20 00:55:02
除了@Dimitry的一个很好的答案之外,我还会添加一句对您来说可能很重要的话:如果您在迭代时开始删除条目,那么可能会发生奇怪的事情。例如,在我的系统中,下面的Python代码:
for mail in folder.Items:
mail.Delete()以及
for index, mail in enumerate(folder.Items, 1):
folder.Remove(index)两种方法都只删除folder中一半的项!原因似乎是项目在内部使用一系列索引来提供迭代器,因此每次删除元素时,列表的尾部都会移动一个.
若要删除文件夹中的所有项目,请尝试:
for i in range(len(folder.Items)):
folder.Remove(1)如果需要按照特定的标准进行筛选,请考虑首先收集EntryIDs,然后删除对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()不过,我认为这方面的表现甚至更糟:
发布于 2019-05-15 17:51:11
以上是来自底达勒斯的伟大回答。想要制作一个更简洁的代码版本:
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限制在一周内,这样它就不会完成整个收件箱的工作。
https://stackoverflow.com/questions/53523943
复制相似问题