我正试图使用python在Outlook中循环浏览电子邮件,并获取每封电子邮件中的所有附件,提取它们,如果符合特定标准,则将它们发送给其他人。目前,我正在保存附件,并在发送电子邮件时重新附加。有没有什么方法可以让我动态地做到这一点,而不首先保存文件
这是我所拥有的:
import os
import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
messages.Sort("[ReceivedTime]", True)
first_msg = messages.GetFirst()
attachments = first_msg.Attachments
attachment = attachments[0]
attachment.SaveAsFile(os.getcwd()+'\'+attachment.filename)
Outlook = win32com.client.Dispatch("Outlook.Application")
mail = Outlook.CreateItem(0)
mail.To = 'email@test.com'
mail.Subject = 'This is a sample'
attachment = mail.Attachments.Add(myfolder/file.pdf)
mail.Body = 'Sending an attachment through email using python'
mail.Send()
有没有一种方法可以绕过保存文件,直接发送附件?
Outlook对象模型不提供任何方法或属性来动态处理附件(而不将其保存到磁盘(。将附件保存到指定路径的Attachment.SaveAsFile方法正是您所需要的。
另一方面,您可以考虑一个低级别的API,Outlook是建立在扩展的MAPI之上的。它允许打开并获取带有流的属性值,而无需将其保存到磁盘。当PR_ATTACH_METHOD
属性的值为ATTACH_BY_VALUE
时,PR_ATTACH_DATA_BIN
属性保存附件,这是常用的附件方法,也是唯一需要支持的方法。当PR_ATTACH_METHOD
的值为ATTACH_OLE时,PR_ATTACH_DATA_BIN
还保存一个OLE 1.0 OLESTREAM附件。有关详细信息,请参阅打开附件。
不在Outlook对象模型中-将附件保存为文件(如果它是常规olByValue
附件(并重新附加它是您唯一的选择。通过将MailItem
对象作为参数传递给Attachments.Add
,您可以将整个原始消息作为附件附加:这将创建一个嵌入的消息附件。
正如Eugene所建议的,您可以使用Extended MAPI(C++或Delphi(,但它在Python中是不可访问的。如果使用Redemption是一个选项(我是它的作者(,它允许将一个附件(RDOAttachment
(作为参数传递给RDOMail.Attachments.Add
,而无需先保存为文件。这适用于所有类型的附件(olByValue
、olOLE
、olEmbeddedItem
等(