mirror of
https://github.com/python/cpython.git
synced 2024-11-30 18:51:15 +01:00
29d1bc0842
This is a wholesale reorganization and editing of the email documentation to make the new API the standard one, and the old API the 'legacy' one. The default is still the compat32 policy, for backward compatibility. We will change that eventually.
54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""Unpack a MIME message into a directory of files."""
|
|
|
|
import os
|
|
import email
|
|
import mimetypes
|
|
|
|
from email.policy import default
|
|
|
|
from argparse import ArgumentParser
|
|
|
|
|
|
def main():
|
|
parser = ArgumentParser(description="""\
|
|
Unpack a MIME message into a directory of files.
|
|
""")
|
|
parser.add_argument('-d', '--directory', required=True,
|
|
help="""Unpack the MIME message into the named
|
|
directory, which will be created if it doesn't already
|
|
exist.""")
|
|
parser.add_argument('msgfile')
|
|
args = parser.parse_args()
|
|
|
|
with open(args.msgfile, 'rb') as fp:
|
|
msg = email.message_from_binary_file(fp, policy=default)
|
|
|
|
try:
|
|
os.mkdir(args.directory)
|
|
except FileExistsError:
|
|
pass
|
|
|
|
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_content_type())
|
|
if not ext:
|
|
# Use a generic bag-of-bits extension
|
|
ext = '.bin'
|
|
filename = 'part-%03d%s' % (counter, ext)
|
|
counter += 1
|
|
with open(os.path.join(args.directory, filename), 'wb') as fp:
|
|
fp.write(part.get_payload(decode=True))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|