| import os |
| import sys |
| import tempfile |
| import mimetypes |
| import webbrowser |
| |
| # Import the email modules we'll need |
| from email import policy |
| from email.parser import BytesParser |
| |
| # An imaginary module that would make this work and be safe. |
| from imaginary import magic_html_parser |
| |
| # In a real program you'd get the filename from the arguments. |
| msg = BytesParser(policy=policy.default).parse(open('outgoing.msg', 'rb')) |
| |
| # Now the header items can be accessed as a dictionary, and any non-ASCII will |
| # be converted to unicode: |
| print('To:', msg['to']) |
| print('From:', msg['from']) |
| print('Subject:', msg['subject']) |
| |
| # If we want to print a priview of the message content, we can extract whatever |
| # the least formatted payload is and print the first three lines. Of course, |
| # if the message has no plain text part printing the first three lines of html |
| # is probably useless, but this is just a conceptual example. |
| simplest = msg.get_body(preferencelist=('plain', 'html')) |
| print() |
| print(''.join(simplest.get_content().splitlines(keepends=True)[:3])) |
| |
| ans = input("View full message?") |
| if ans.lower()[0] == 'n': |
| sys.exit() |
| |
| # We can extract the richest alternative in order to display it: |
| richest = msg.get_body() |
| partfiles = {} |
| if richest['content-type'].maintype == 'text': |
| if richest['content-type'].subtype == 'plain': |
| for line in richest.get_content().splitlines(): |
| print(line) |
| sys.exit() |
| elif richest['content-type'].subtype == 'html': |
| body = richest |
| else: |
| print("Don't know how to display {}".format(richest.get_content_type())) |
| sys.exit() |
| elif richest['content-type'].content_type == 'multipart/related': |
| body = richest.get_body(preferencelist=('html')) |
| for part in richest.iter_attachments(): |
| fn = part.get_filename() |
| if fn: |
| extension = os.path.splitext(part.get_filename())[1] |
| else: |
| extension = mimetypes.guess_extension(part.get_content_type()) |
| with tempfile.NamedTemporaryFile(suffix=extension, delete=False) as f: |
| f.write(part.get_content()) |
| # again strip the <> to go from email form of cid to html form. |
| partfiles[part['content-id'][1:-1]] = f.name |
| else: |
| print("Don't know how to display {}".format(richest.get_content_type())) |
| sys.exit() |
| with tempfile.NamedTemporaryFile(mode='w', delete=False) as f: |
| # The magic_html_parser has to rewrite the href="cid:...." attributes to |
| # point to the filenames in partfiles. It also has to do a safety-sanitize |
| # of the html. It could be written using html.parser. |
| f.write(magic_html_parser(body.get_content(), partfiles)) |
| webbrowser.open(f.name) |
| os.remove(f.name) |
| for fn in partfiles.values(): |
| os.remove(fn) |
| |
| # Of course, there are lots of email messages that could break this simple |
| # minded program, but it will handle the most common ones. |