mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 29d1bc0842
			
		
	
	
		29d1bc0842
		
	
	
	
	
		
			
			This is a wholesale reorganization and editing of the email documentation to make the new API the standard one, and the old API the 'legacy' one. The default is still the compat32 policy, for backward compatibility. We will change that eventually.
		
			
				
	
	
		
			53 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| """Unpack a MIME message into a directory of files."""
 | |
| 
 | |
| import os
 | |
| import email
 | |
| import mimetypes
 | |
| 
 | |
| from email.policy import default
 | |
| 
 | |
| from argparse import ArgumentParser
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     parser = ArgumentParser(description="""\
 | |
| Unpack a MIME message into a directory of files.
 | |
| """)
 | |
|     parser.add_argument('-d', '--directory', required=True,
 | |
|                         help="""Unpack the MIME message into the named
 | |
|                         directory, which will be created if it doesn't already
 | |
|                         exist.""")
 | |
|     parser.add_argument('msgfile')
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     with open(args.msgfile, 'rb') as fp:
 | |
|         msg = email.message_from_binary_file(fp, policy=default)
 | |
| 
 | |
|     try:
 | |
|         os.mkdir(args.directory)
 | |
|     except FileExistsError:
 | |
|         pass
 | |
| 
 | |
|     counter = 1
 | |
|     for part in msg.walk():
 | |
|         # multipart/* are just containers
 | |
|         if part.get_content_maintype() == 'multipart':
 | |
|             continue
 | |
|         # Applications should really sanitize the given filename so that an
 | |
|         # email message can't be used to overwrite important files
 | |
|         filename = part.get_filename()
 | |
|         if not filename:
 | |
|             ext = mimetypes.guess_extension(part.get_content_type())
 | |
|             if not ext:
 | |
|                 # Use a generic bag-of-bits extension
 | |
|                 ext = '.bin'
 | |
|             filename = 'part-%03d%s' % (counter, ext)
 | |
|         counter += 1
 | |
|         with open(os.path.join(args.directory, filename), 'wb') as fp:
 | |
|             fp.write(part.get_payload(decode=True))
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |