summaryrefslogtreecommitdiffstats
path: root/Doc/includes/email-unpack.py
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/includes/email-unpack.py')
-rw-r--r--Doc/includes/email-unpack.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/Doc/includes/email-unpack.py b/Doc/includes/email-unpack.py
new file mode 100644
index 0000000..e596b98
--- /dev/null
+++ b/Doc/includes/email-unpack.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+
+"""Unpack a MIME message into a directory of files."""
+
+import os
+import sys
+import email
+import errno
+import mimetypes
+
+from optparse import OptionParser
+
+
+def main():
+ parser = OptionParser(usage="""\
+Unpack a MIME message into a directory of files.
+
+Usage: %prog [options] msgfile
+""")
+ parser.add_option('-d', '--directory',
+ type='string', action='store',
+ help="""Unpack the MIME message into the named
+ directory, which will be created if it doesn't already
+ exist.""")
+ opts, args = parser.parse_args()
+ if not opts.directory:
+ parser.print_help()
+ sys.exit(1)
+
+ try:
+ msgfile = args[0]
+ except IndexError:
+ parser.print_help()
+ sys.exit(1)
+
+ try:
+ os.mkdir(opts.directory)
+ except OSError as e:
+ # Ignore directory exists error
+ if e.errno != errno.EEXIST:
+ raise
+
+ fp = open(msgfile)
+ msg = email.message_from_file(fp)
+ fp.close()
+
+ counter = 1
+ for part in msg.walk():
+ # multipart/* are just containers
+ if part.get_content_maintype() == 'multipart':
+ continue
+ # Applications should really sanitize the given filename so that an
+ # email message can't be used to overwrite important files
+ filename = part.get_filename()
+ if not filename:
+ ext = mimetypes.guess_extension(part.get_type())
+ if not ext:
+ # Use a generic bag-of-bits extension
+ ext = '.bin'
+ filename = 'part-%03d%s' % (counter, ext)
+ counter += 1
+ fp = open(os.path.join(opts.directory, filename), 'wb')
+ fp.write(part.get_payload(decode=True))
+ fp.close()
+
+
+if __name__ == '__main__':
+ main()