将 Outlook 附件保存到内存而不是磁盘

Save Outlook attachment to memory instead of disk

我每天在电子邮件中有几百个 Excel 附件,我想从中提取适当的数据并将其保存到数据库中。我想避免将每个附件保存到磁盘只是为了从磁盘重新打开以读取,因为我再也不需要将文件保存到磁盘了。对于这个项目,当然,我可以删除它们,但应该有更好的方法。

这是我目前所做的

outlook = Dispatch("Outlook.Application").GetNamespace("MAPI")
folder = outlook.Folders[blah].Folders[blahblah]

for item in folder.items:
    for att in item.Attachments:
        att.SaveAsFile(???) # This is where I need something cool, like stream or bytes or something that I don't understand
        # do something with the file, either read with pandas or openpyxl

如果我什至可以绕过保存并让 pandas / openpyxl 在不保存的情况下读取它,那就太好了,但是他们都不能直接读取 att .

Outlook 对象模型不允许您这样做:AttachmentSaveAsFile 只允许指定有效的文件名。

在扩展 MAPI 级别(仅限 C++ 或 Delphi),访问附件数据的唯一方法(扩展 MAPI 对文件一无所知)是打开 PR_ATTACH_DATA_BIN MAPI 属性 作为 IStream 接口:IAttach::OpenProperty(PR_ATTACH_DATA_BIN, IID_IStream, ...)。然后,您可以直接从 IStream 界面检索数据。

如果使用 Redemption (any language, I am its author) is an option, it exposes RDOAttachment.AsStream / AsArray / AsText 允许访问原始附件数据而无需先将其保存为文件的属性。