Mercurial > cpython-lru_cache-weakref
annotate Demo/scripts/mboxconvert.py @ 5817:48b94de85bf3 legacy-trunk
Extensive changes by AMK.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Thu, 17 Jul 1997 16:29:42 +0000 |
| parents | 73758db2f464 |
| children | 71a294bd7950 |
| rev | line source |
|---|---|
|
4573
73758db2f464
/usr/local/bin/python -> /usr/bin/env python
Guido van Rossum <guido@python.org>
parents:
2139
diff
changeset
|
1 #! /usr/bin/env python |
| 1862 | 2 |
| 3 # Convert MH directories (1 message per file) or MMDF mailboxes (4x^A | |
| 4 # delimited) to unix mailbox (From ... delimited) on stdout. | |
| 5 # If -f is given, files contain one message per file (e.g. MH messages) | |
| 6 | |
| 7 import rfc822 | |
| 8 import sys | |
| 9 import time | |
| 10 import os | |
| 11 import stat | |
| 12 import getopt | |
| 13 import regex | |
| 14 | |
| 15 def main(): | |
| 16 dofile = mmdf | |
| 17 try: | |
| 18 opts, args = getopt.getopt(sys.argv[1:], 'f') | |
| 19 except getopt.error, msg: | |
| 20 sys.stderr.write('%s\n' % msg) | |
| 21 sys.exit(2) | |
| 22 for o, a in opts: | |
| 23 if o == '-f': | |
| 24 dofile = message | |
| 25 if not args: | |
| 26 args = ['-'] | |
| 27 sts = 0 | |
| 28 for arg in args: | |
| 29 if arg == '-' or arg == '': | |
| 30 sts = dofile(sys.stdin) or sts | |
| 31 elif os.path.isdir(arg): | |
| 32 sts = mh(arg) or sts | |
| 33 elif os.path.isfile(arg): | |
| 34 try: | |
| 35 f = open(arg) | |
| 36 except IOError, msg: | |
| 37 sys.stderr.write('%s: %s\n' % (arg, msg)) | |
| 38 sts = 1 | |
| 39 continue | |
| 40 sts = dofile(f) or sts | |
| 41 f.close() | |
| 42 else: | |
|
2065
26cd4d6c2d12
sys.stderr(...) should be sys.stderr.write(), of course
Guido van Rossum <guido@python.org>
parents:
1862
diff
changeset
|
43 sys.stderr.write('%s: not found\n' % arg) |
| 1862 | 44 sts = 1 |
| 45 if sts: | |
| 46 sys.exit(sts) | |
| 47 | |
| 48 numeric = regex.compile('[1-9][0-9]*') | |
| 49 | |
| 50 def mh(dir): | |
| 51 sts = 0 | |
| 52 msgs = os.listdir(dir) | |
| 53 for msg in msgs: | |
| 54 if numeric.match(msg) != len(msg): | |
| 55 continue | |
| 56 fn = os.path.join(dir, msg) | |
| 57 try: | |
| 58 f = open(fn) | |
| 59 except IOError, msg: | |
| 60 sys.stderr.write('%s: %s\n' % (fn, msg)) | |
| 61 sts = 1 | |
| 62 continue | |
| 63 sts = message(f) or sts | |
| 64 return sts | |
| 65 | |
| 66 def mmdf(f): | |
| 67 sts = 0 | |
| 68 while 1: | |
| 69 line = f.readline() | |
| 70 if not line: | |
| 71 break | |
| 72 if line == '\1\1\1\1\n': | |
| 73 sts = message(f, line) or sts | |
| 74 else: | |
| 75 sys.stderr.write( | |
| 76 'Bad line in MMFD mailbox: %s\n' % `line`) | |
| 77 return sts | |
| 78 | |
|
2139
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
79 counter = 0 # for generating unique Message-ID headers |
|
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
80 |
| 1862 | 81 def message(f, delimiter = ''): |
| 82 sts = 0 | |
| 83 # Parse RFC822 header | |
| 84 m = rfc822.Message(f) | |
| 85 # Write unix header line | |
| 86 fullname, email = m.getaddr('From') | |
| 87 tt = m.getdate('Date') | |
| 88 if tt: | |
| 89 t = time.mktime(tt) | |
| 90 else: | |
| 91 sys.stderr.write( | |
| 92 'Unparseable date: %s\n' % `m.getheader('Date')`) | |
| 93 t = os.fstat(f.fileno())[stat.ST_MTIME] | |
| 94 print 'From', email, time.ctime(t) | |
| 95 # Copy RFC822 header | |
| 96 for line in m.headers: | |
| 97 print line, | |
|
2139
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
98 # Invent Message-ID header if none is present |
|
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
99 if not m.has_key('message-id'): |
|
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
100 global counter |
|
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
101 counter = counter + 1 |
|
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
102 msgid = "<%s.%d>" % (hex(t), counter) |
|
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
103 sys.stderr.write("Adding Message-ID %s (From %s)\n" % |
|
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
104 (msgid, email)) |
|
94e2ca86590a
Invent Message-ID header if none is present
Guido van Rossum <guido@python.org>
parents:
2065
diff
changeset
|
105 print "Message-ID:", msgid |
| 1862 | 106 print |
| 107 # Copy body | |
| 108 while 1: | |
| 109 line = f.readline() | |
| 110 if line == delimiter: | |
| 111 break | |
| 112 if not line: | |
| 113 sys.stderr.write('Unexpected EOF in message\n') | |
| 114 sts = 1 | |
| 115 break | |
| 116 if line[:5] == 'From ': | |
| 117 line = '>' + line | |
| 118 print line, | |
| 119 # Print trailing newline | |
| 120 print | |
| 121 return sts | |
| 122 | |
| 123 main() |
