diff options
| author | R David Murray <rdmurray@bitdance.com> | 2014-02-07 15:55:17 (GMT) | 
|---|---|---|
| committer | R David Murray <rdmurray@bitdance.com> | 2014-02-07 15:55:17 (GMT) | 
| commit | 02384bfa9481d7e6276dfa6cf2fcfb0f59012be2 (patch) | |
| tree | 9e173714bcbd00f2e47d25be5103df8de74a7356 /Doc/includes/email-read-alternative-new-api.py | |
| parent | aa21297457ef0e5647602e19a89c4b797183c16e (diff) | |
| download | cpython-02384bfa9481d7e6276dfa6cf2fcfb0f59012be2.zip cpython-02384bfa9481d7e6276dfa6cf2fcfb0f59012be2.tar.gz cpython-02384bfa9481d7e6276dfa6cf2fcfb0f59012be2.tar.bz2  | |
#20477: add examples of using the new contentmanager API.
Diffstat (limited to 'Doc/includes/email-read-alternative-new-api.py')
| -rw-r--r-- | Doc/includes/email-read-alternative-new-api.py | 74 | 
1 files changed, 74 insertions, 0 deletions
diff --git a/Doc/includes/email-read-alternative-new-api.py b/Doc/includes/email-read-alternative-new-api.py new file mode 100644 index 0000000..8ab4e9f --- /dev/null +++ b/Doc/includes/email-read-alternative-new-api.py @@ -0,0 +1,74 @@ +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.  | 
