diff --git a/Lib/mailbox.py b/Lib/mailbox.py new file mode 100755 index 00000000000..b7a5598c83b --- /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) +