| 
									
										
										
										
											2014-02-07 10:55:17 -05:00
										 |  |  | 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. | 
					
						
							| 
									
										
										
										
											2015-02-25 18:14:09 +02:00
										 |  |  | with open('outgoing.msg', 'rb') as fp: | 
					
						
							|  |  |  |     msg = BytesParser(policy=policy.default).parse(fp) | 
					
						
							| 
									
										
										
										
											2014-02-07 10:55:17 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | # 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']) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-14 14:04:53 +03:00
										 |  |  | # If we want to print a preview of the message content, we can extract whatever | 
					
						
							| 
									
										
										
										
											2014-02-07 10:55:17 -05:00
										 |  |  | # 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. |