# # 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, length = None): if self.pos >= self.stop: return '' if length is None: length = self.stop - self.pos self.fp.seek(self.pos) self.pos = self.pos + length return self.fp.read(length) def readline(self, length = None): if self.pos >= self.stop: return '' if length is None: length = self.stop - self.pos 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)