| 
									
										
										
										
											2010-03-11 22:53:45 +00:00
										 |  |  | #! /usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											1994-09-05 11:51:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Convert  MH directories (1 message per file) or MMDF mailboxes (4x^A | 
					
						
							|  |  |  | # delimited) to unix mailbox (From ... delimited) on stdout. | 
					
						
							|  |  |  | # If -f is given, files contain one message per file (e.g. MH messages) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import rfc822 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import stat | 
					
						
							|  |  |  | import getopt | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											1994-09-05 11:51:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     dofile = mmdf | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         opts, args = getopt.getopt(sys.argv[1:], 'f') | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |     except getopt.error as msg: | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |         sys.stderr.write('%s\n' % msg) | 
					
						
							|  |  |  |         sys.exit(2) | 
					
						
							|  |  |  |     for o, a in opts: | 
					
						
							|  |  |  |         if o == '-f': | 
					
						
							|  |  |  |             dofile = message | 
					
						
							|  |  |  |     if not args: | 
					
						
							|  |  |  |         args = ['-'] | 
					
						
							|  |  |  |     sts = 0 | 
					
						
							|  |  |  |     for arg in args: | 
					
						
							|  |  |  |         if arg == '-' or arg == '': | 
					
						
							|  |  |  |             sts = dofile(sys.stdin) or sts | 
					
						
							|  |  |  |         elif os.path.isdir(arg): | 
					
						
							|  |  |  |             sts = mh(arg) or sts | 
					
						
							|  |  |  |         elif os.path.isfile(arg): | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 f = open(arg) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |             except IOError as msg: | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |                 sys.stderr.write('%s: %s\n' % (arg, msg)) | 
					
						
							|  |  |  |                 sts = 1 | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             sts = dofile(f) or sts | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             sys.stderr.write('%s: not found\n' % arg) | 
					
						
							|  |  |  |             sts = 1 | 
					
						
							|  |  |  |     if sts: | 
					
						
							|  |  |  |         sys.exit(sts) | 
					
						
							| 
									
										
										
										
											1994-09-05 11:51:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | numeric = re.compile('[1-9][0-9]*') | 
					
						
							| 
									
										
										
										
											1994-09-05 11:51:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def mh(dir): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     sts = 0 | 
					
						
							|  |  |  |     msgs = os.listdir(dir) | 
					
						
							|  |  |  |     for msg in msgs: | 
					
						
							|  |  |  |         if numeric.match(msg) != len(msg): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         fn = os.path.join(dir, msg) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             f = open(fn) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |         except IOError as msg: | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |             sys.stderr.write('%s: %s\n' % (fn, msg)) | 
					
						
							|  |  |  |             sts = 1 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         sts = message(f) or sts | 
					
						
							|  |  |  |     return sts | 
					
						
							| 
									
										
										
										
											1994-09-05 11:51:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def mmdf(f): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     sts = 0 | 
					
						
							|  |  |  |     while 1: | 
					
						
							|  |  |  |         line = f.readline() | 
					
						
							|  |  |  |         if not line: | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |         if line == '\1\1\1\1\n': | 
					
						
							|  |  |  |             sts = message(f, line) or sts | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             sys.stderr.write( | 
					
						
							|  |  |  |                     'Bad line in MMFD mailbox: %r\n' % (line,)) | 
					
						
							|  |  |  |     return sts | 
					
						
							| 
									
										
										
										
											1994-09-05 11:51:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-12 12:40:48 +00:00
										 |  |  | counter = 0 # for generating unique Message-ID headers | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-09-05 11:51:33 +00:00
										 |  |  | def message(f, delimiter = ''): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     sts = 0 | 
					
						
							|  |  |  |     # Parse RFC822 header | 
					
						
							|  |  |  |     m = rfc822.Message(f) | 
					
						
							|  |  |  |     # Write unix header line | 
					
						
							|  |  |  |     fullname, email = m.getaddr('From') | 
					
						
							|  |  |  |     tt = m.getdate('Date') | 
					
						
							|  |  |  |     if tt: | 
					
						
							|  |  |  |         t = time.mktime(tt) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         sys.stderr.write( | 
					
						
							| 
									
										
										
										
											2008-06-12 04:06:45 +00:00
										 |  |  |                 'Unparseable date: %r\n' % (m.get('Date'),)) | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |         t = os.fstat(f.fileno())[stat.ST_MTIME] | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |     print('From', email, time.ctime(t)) | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     # Copy RFC822 header | 
					
						
							|  |  |  |     for line in m.headers: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print(line, end=' ') | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     # Invent Message-ID header if none is present | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |     if 'message-id' not in m: | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |         global counter | 
					
						
							|  |  |  |         counter = counter + 1 | 
					
						
							|  |  |  |         msgid = "<%s.%d>" % (hex(t), counter) | 
					
						
							|  |  |  |         sys.stderr.write("Adding Message-ID %s (From %s)\n" % | 
					
						
							|  |  |  |                          (msgid, email)) | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print("Message-ID:", msgid) | 
					
						
							|  |  |  |     print() | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     # Copy body | 
					
						
							|  |  |  |     while 1: | 
					
						
							|  |  |  |         line = f.readline() | 
					
						
							|  |  |  |         if line == delimiter: | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |         if not line: | 
					
						
							|  |  |  |             sys.stderr.write('Unexpected EOF in message\n') | 
					
						
							|  |  |  |             sts = 1 | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |         if line[:5] == 'From ': | 
					
						
							|  |  |  |             line = '>' + line | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print(line, end=' ') | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     # Print trailing newline | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |     print() | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     return sts | 
					
						
							| 
									
										
										
										
											1994-09-05 11:51:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-09-11 16:34:35 +00:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     main() |