mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| """Unpack a MIME message into a directory of files."""
 | |
| 
 | |
| import os
 | |
| import sys
 | |
| import email
 | |
| import errno
 | |
| import mimetypes
 | |
| 
 | |
| from optparse import OptionParser
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     parser = OptionParser(usage="""\
 | |
| Unpack a MIME message into a directory of files.
 | |
| 
 | |
| Usage: %prog [options] msgfile
 | |
| """)
 | |
|     parser.add_option('-d', '--directory',
 | |
|                       type='string', action='store',
 | |
|                       help="""Unpack the MIME message into the named
 | |
|                       directory, which will be created if it doesn't already
 | |
|                       exist.""")
 | |
|     opts, args = parser.parse_args()
 | |
|     if not opts.directory:
 | |
|         parser.print_help()
 | |
|         sys.exit(1)
 | |
| 
 | |
|     try:
 | |
|         msgfile = args[0]
 | |
|     except IndexError:
 | |
|         parser.print_help()
 | |
|         sys.exit(1)
 | |
| 
 | |
|     try:
 | |
|         os.mkdir(opts.directory)
 | |
|     except OSError as e:
 | |
|         # Ignore directory exists error
 | |
|         if e.errno != errno.EEXIST:
 | |
|             raise
 | |
| 
 | |
|     fp = open(msgfile)
 | |
|     msg = email.message_from_file(fp)
 | |
|     fp.close()
 | |
| 
 | |
|     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
 | |
|         fp = open(os.path.join(opts.directory, filename), 'wb')
 | |
|         fp.write(part.get_payload(decode=True))
 | |
|         fp.close()
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |