Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
allendowney
GitHub Repository: allendowney/cpython
Path: blob/main/Doc/includes/email-unpack.py
12 views
1
#!/usr/bin/env python3
2
3
"""Unpack a MIME message into a directory of files."""
4
5
import os
6
import email
7
import mimetypes
8
9
from email.policy import default
10
11
from argparse import ArgumentParser
12
13
14
def main():
15
parser = ArgumentParser(description="""\
16
Unpack a MIME message into a directory of files.
17
""")
18
parser.add_argument('-d', '--directory', required=True,
19
help="""Unpack the MIME message into the named
20
directory, which will be created if it doesn't already
21
exist.""")
22
parser.add_argument('msgfile')
23
args = parser.parse_args()
24
25
with open(args.msgfile, 'rb') as fp:
26
msg = email.message_from_binary_file(fp, policy=default)
27
28
try:
29
os.mkdir(args.directory)
30
except FileExistsError:
31
pass
32
33
counter = 1
34
for part in msg.walk():
35
# multipart/* are just containers
36
if part.get_content_maintype() == 'multipart':
37
continue
38
# Applications should really sanitize the given filename so that an
39
# email message can't be used to overwrite important files
40
filename = part.get_filename()
41
if not filename:
42
ext = mimetypes.guess_extension(part.get_content_type())
43
if not ext:
44
# Use a generic bag-of-bits extension
45
ext = '.bin'
46
filename = f'part-{counter:03d}{ext}'
47
counter += 1
48
with open(os.path.join(args.directory, filename), 'wb') as fp:
49
fp.write(part.get_payload(decode=True))
50
51
52
if __name__ == '__main__':
53
main()
54
55