[PyWebMail-Checkins] webmail/webmail/utils xmailbox.py,NONE,1.1
Status: Beta
Brought to you by:
dubnerm
From: Michael D. <du...@us...> - 2008-03-02 17:09:29
|
Update of /cvsroot/pywebmail/webmail/webmail/utils In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23472 Added Files: xmailbox.py Log Message: moved from cgi_server, because now also used by file backend --- NEW FILE: xmailbox.py --- import sys, os, getopt, mailbox, rfc822 try: from cStringIO import StringIO except: from StringIO import StringIO class _FileUnread: def __init__(self, fp, unread_data=''): self.__dict__['fp'] = fp self.__dict__['unread_data'] = unread_data def __getattr__(self, name): return getattr(self.fp, name) def __setattr__(self, name, val): setattr(self.fp, name, val) def read(self, sizehint=-1): buf = '' if self.unread_data: if sizehint>0 and len(self.unread_data)>sizehint: buf = self.unread_data[:sizehint] self.__dict__['unread_data'] = self.unread_data[sizehint:] return buf buf = self.unread_data self.__dict__['unread_data'] = '' if sizehint>0: sizehint = sizehint-len(buf) return buf+self.fp.read(sizehint) def readline(self): buf = '' if self.unread_data: f = StringIO(self.unread_data) buf = f.readline() rest = f.read() f.close() del f self.__dict__['unread_data'] = rest if buf[-1:] in '\n\r': return buf return buf+self.fp.readline() def unread(self, data): self.__dict__['unread_data'] = data+self.unread_data class NetscapeMessage(rfc822.Message): def readheaders(self): self.netscapefrom = '' startofline = None firstline = 1 self.dict = {} self.unixfrom = '' self.headers = [] self.status = '' self.netscape_headers = [] gtfrom = None data = '' if self.seekable: try: startofmsg = self.fp.tell() except IOError: self.seekable = 0 while 1: if self.seekable: startofline = self.fp.tell() line = self.fp.readline() if not self.seekable: data = data+line if not line: self.status = 'EOF in headers' return if firstline and line.startswith('From '): self.netscapefrom = self.netscapefrom + line continue firstline = 0 if line.startswith('>From '): gtfrom = startofline+1 break if self.islast(line): self.netscapefrom = '' self.netscape_headers = [] break self.netscape_headers.append(line) if gtfrom is not None: if hasattr(self.fp, 'unread'): self.fp.unread(line[1:]) elif self.seekable: self.fp.seek(gtfrom) else: self.fp = _FileUnread(self.fp, line[1:]) else: if hasattr(self.fp, 'unread'): self.fp.unread(data) elif self.seekable: self.fp.seek(startofmsg) else: self.fp = _FileUnread(self.fp, data) rfc822.Message.readheaders(self) if gtfrom: for line in self.netscape_headers: headerseen = self.isheader(line) if headerseen: self.dict[headerseen] = line[len(headerseen)+1:].strip() class NetscapeMailbox(mailbox.PortableUnixMailbox): def __init__(self, fp, factory=NetscapeMessage): mailbox.PortableUnixMailbox.__init__(self, fp, factory) def main(argv): file = '' verbose = 0 msgno = None try: optlist,args = getopt.getopt(argv[1:], 'f:vq') for opt,optarg in optlist: if opt == '-v': verbose = verbose+1 if opt == '-q': verbose = verbose-1 if opt == '-f': file = optarg if args and not file: file,args = args[0],args[1:] if args: try: msgno,args = int(args[0]),args[1:] except e: raise getopt.GetoptError, (str(e), args[0]) if args: raise getopt.GetoptError, ('Too many arguments: '+str(args), 'f') except getopt.GetoptError, e: if e.opt != 'h': print 'Error:', e print 'Usage:', argv[0], '[-v|-q]', '[-f] <file>', '[<msgno>]' return f = open(file, 'rb') mb = NetscapeMailbox(f) msgs = [] while 1: msg = mb.next() if msg is None: break msgs.append(msg) if msgno is None: msg.fp = None if msgno is not None: print 'Message %d/%d body:' % (msgno,len(msgs)) msg = msgs[msgno-1] if verbose > 0: map(sys.stdout.write, msg.headers) msg.rewindbody() sys.stdout.write(msg.fp.read()) else: print 'Mailbox',file,'has',len(msgs),'messages:' for msg in msgs: f = msg.getheader('from') or "" s = msg.getheader('subject') or "" d = msg.getheader('date') or "" print '-%20.20s %20.20s %-30.30s'%(f, d[5:], s) if __name__=='__main__': main(sys.argv) |