summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1994-04-28 09:53:33 (GMT)
committerGuido van Rossum <guido@python.org>1994-04-28 09:53:33 (GMT)
commitc7b688232664ed8e5ec08b07aae0568c4aa2cd3f (patch)
treef6f72a06e094c5337b8784884d1c9ef9b4089119 /Lib
parent581d172d61a45707c7ddd7bc02aef632f27a20fa (diff)
downloadcpython-c7b688232664ed8e5ec08b07aae0568c4aa2cd3f.zip
cpython-c7b688232664ed8e5ec08b07aae0568c4aa2cd3f.tar.gz
cpython-c7b688232664ed8e5ec08b07aae0568c4aa2cd3f.tar.bz2
Jack's module for parsing UNIX mailbox files
Diffstat (limited to 'Lib')
-rwxr-xr-xLib/mailbox.py137
1 files changed, 137 insertions, 0 deletions
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
new file mode 100755
index 0000000..b7a5598
--- /dev/null
+++ b/Lib/mailbox.py
@@ -0,0 +1,137 @@
+#
+# A class to hand a unix-style or mmdf-style mailboxes
+#
+# Jack Jansen, CWI, March 1994.
+#
+import rfc822
+
+class _Mailbox:
+ def __init__(self, fp):
+ self.fp = fp
+ self.seekp = 0
+
+ def seek(self, pos):
+ self.seekp = pos
+
+ def next(self):
+ while 1:
+ self.fp.seek(self.seekp)
+ try:
+ self._search_start()
+ except EOFError:
+ self.seekp = self.fp.tell()
+ return None
+ start = self.fp.tell()
+ self._search_end()
+ self.seekp = stop = self.fp.tell()
+ if start <> stop:
+ break
+ return rfc822.Message(_Subfile(self.fp, start, stop))
+
+class _Subfile:
+ def __init__(self, fp, start, stop):
+ self.fp = fp
+ self.start = start
+ self.stop = stop
+ self.pos = self.start
+
+ def read(self, *args):
+ if self.pos >= self.stop:
+ return ''
+ if args == ():
+ length = self.stop - self.pos
+ else:
+ length = args[0]
+ self.fp.seek(self.pos)
+ self.pos = self.pos + length
+ return self.fp.read(length)
+
+ def readline(self, *args):
+ if self.pos >= self.stop:
+ return ''
+ if args == ():
+ length = self.stop - self.pos
+ else:
+ length = args[0]
+ self.fp.seek(self.pos)
+ data = self.fp.readline(length)
+ if len(data) < length:
+ length = len(data)
+ self.pos = self.pos + length
+ return data
+
+ def tell(self):
+ return self.pos - self.start
+
+ def seek(self, pos):
+ self.pos = pos + self.start
+
+ def close(self):
+ pass
+
+class UnixMailbox(_Mailbox):
+ def _search_start(self):
+ while 1:
+ line = self.fp.readline()
+ if not line:
+ raise EOFError
+ if line[:5] == 'From ':
+ return
+
+ def _search_end(self):
+ while 1:
+ pos = self.fp.tell()
+ line = self.fp.readline()
+ if not line:
+ return
+ if line[:5] == 'From ':
+ self.fp.seek(pos)
+ return
+
+class MmdfMailbox(_Mailbox):
+ def _search_start(self):
+ while 1:
+ line = self.fp.readline()
+ if not line:
+ raise EOFError
+ if line[:5] == '\001\001\001\001\n':
+ return
+
+ def _search_end(self):
+ while 1:
+ pos = self.fp.tell()
+ line = self.fp.readline()
+ if not line:
+ return
+ if line == '\001\001\001\001\n':
+ self.fp.seek(pos)
+ return
+
+if __name__ == '__main__':
+ import posix
+ import time
+ import sys
+ import string
+ mbox = '/usr/mail/'+posix.environ['USER']
+ fp = open(mbox, 'r')
+ mb = UnixMailbox(fp)
+ msgs = []
+ while 1:
+ msg = mb.next()
+ if not msg:
+ break
+ msgs.append(msg)
+ if len(sys.argv) > 1:
+ num = string.atoi(sys.argv[1])
+ print 'Message %d body:'%num
+ msg = msgs[num-1]
+ msg.rewindbody()
+ sys.stdout.write(msg.fp.read())
+ sys.exit(0)
+ print 'Mailbox',mbox,'has',len(msgs),'messages:'
+ for msg in msgs:
+ f = msg.getheader('from')
+ s = msg.getheader('subject')
+ d = (msg.getheader('date'))
+ print '%20.20s %18.18s %-30.30s'%(f, d[5:], s)
+