J
John Henry
When (and if) I finally figure out how to get it done, I surely will
make the code available. It's pretty close. All I need is to figure
out how to extract the attachments.
Too bad I don't know (and don't have) C#. This guy did it so cleanly:
http://www.codeproject.com/KB/office/reading_an_outlook_msg.aspx?msg=....
May be somebody that knows both C# and Python can convert the code
(not much code) and then the Python community will have it. As it
stands, it seems the solution is available in Java, C#, VB .... but
not Python.
BTW: For the benefit of future search on this topic, with the code
listed above where:
storage_flags = STGM_DIRECT | STGM_READ | STGM_SHARE_EXCLUSIVE
I had to change it to:
storage_flags = STGM_DIRECT | STGM_READ | STGM_SHARE_DENY_NONE |
STGM_TRANSACTED
otherwise I get a sharing violation (see
http://efreedom.com/Question/1-1086814/Opening-OLE-Compound-Documents-Read-StgOpenStorage).
For now, I am using a brute force method (http://mail.python.org/
pipermail/python-win32/2009-February/008825.html) to get the names of
the attachments and if I need to extract the attachments, I pop up the
message in Outlook and let Outlook extract the files. Ugly but fits
my client's need for now. Hopefully there will be a cleaner solution
down the road.
Here's my code for brute forcing attachments out of the msg file (very
ugly):
def get_attachments(self, fileID):
#from win32com.storagecon import *
from win32com import storagecon
import pythoncom
flags = storagecon.STGM_READ | storagecon.STGM_SHARE_DENY_NONE |
storagecon.STGM_TRANSACTED
try:
storage = pythoncom.StgOpenStorage (fileID, None, flags)
except:
return []
flags = storagecon.STGM_READ | storagecon.STGM_SHARE_EXCLUSIVE
attachments=[]
for data in storage.EnumElements ():
print data[0], data[1]
if data[1] == 2 or data[0] == "__substg1.0_007D001F":
stream = storage.OpenStream (data[0], None, flags)
try:
msg = stream.Read (data[2])
except:
pass
else:
msg = repr (msg).replace("\
\x00","").strip("'").replace("%23","#")
if data[0] == "__substg1.0_007D001F":
try:
attachments.append(msg.split("name=\"")[1].split("\"")[0])
except:
pass
return attachments