#!/usr/bin/env python ##################################################### # Decode mail attachments sent in base64 encoded # form (and others). Rather than editing by hand, # this version reads the entire mail message # and fetches, decodes and writes each individual # part to its own file. It doesn't assume that # the base64 encoded data has been extracted into # a separate file. Decodes uuencoded attachments # too. mhlib uses mimetools.Message, multifile, # and mimetools.decode. # # To use, copy mail message to mailfile and run: # % python ..\decodeAll.py mailfile # which makes one or more mailfile.part* outputs. # Also supports nested multipart encoding (parts # within parts, e.g., text and html alternatives). # On some platforms you can also simply point an # email client like Outlook at the file (e,g., on # Windows, give the file a .eml extension and click) # but this script is more portable, and may be more # convenient especially if there are many parts. ##################################################### import sys, mhlib from types import * iname = 'mailmessage.txt' if len(sys.argv) == 3: iname, oname = sys.argv[1:] # % python prog [iname [oname]?]? elif len(sys.argv) == 2: iname = sys.argv[1] oname = iname + '.part' def writeparts(part, oname): global partnum content = part.getbody() # decoded content or list if type(content) == ListType: # multiparts: recur for each for subpart in content: writeparts(subpart, oname) else: # else single decoded part assert type(content) == StringType # use filename if in headers print; print part.getparamnames() # else make one with counter fmode = 'wb' fname = part.getparam('name') if not fname: fmode = 'w' fname = oname + str(partnum) if part.gettype() == 'text/plain': fname = fname + '.txt' elif part.gettype() == 'text/html': fname = fname + '.html' output = open(fname, fmode) # mode must be 'wb' on windows print 'writing:', output.name # for word doc files, not 'w' output.write(content) partnum = partnum + 1 partnum = 0 input = open(iname, 'r') # open mail file message = mhlib.Message('.', 0, input) # folder, number args ignored writeparts(message, oname) print 'done: wrote %s parts' % partnum