Home > database >  Save Outlook attachment to memory instead of disk
Save Outlook attachment to memory instead of disk

Time:04-08

I have a couple hundred daily Excel attachments in email that I want to pull appropriate data from and save into a database. I want to avoid saving each attachment to disk only to re-open from disk to read, since I'll never need the files saved to disk ever again. For this project, sure, I could just do it and delete them, but there ought to be a better way.

Here's what I'm doing so far

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

If I can get around even doing the save and have pandas / openpyxl read it without saving, that would be great, but neither of them can read the att directly.

CodePudding user response:

Outlook Object Model won't let you do that: Attachment.SaveAsFile only allows to specify a valid file name.

On the Extended MAPI level (C or Delphi only), the one and only way to access attachment data (Extended MAPI does not know anything about files) is to open the PR_ATTACH_DATA_BIN MAPI property as IStream interface: IAttach::OpenProperty(PR_ATTACH_DATA_BIN, IID_IStream, ...). You can then retreive the data directly from the IStream interface.

If using Redemption (any language, I am its author) is an option, it exposes RDOAttachment.AsStream / AsArray / AsText properties that allow to access raw attachment data without saving it as file first.

  • Related