mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
	
	
		
			75 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			75 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								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.
							 |