[PyWebMail-Checkins] webmail/webmail/backends file.py, NONE, 1.1 __init__.py, 1.6, 1.7
Status: Beta
Brought to you by:
dubnerm
From: Michael D. <du...@us...> - 2008-03-02 11:06:44
|
Update of /cvsroot/pywebmail/webmail/webmail/backends In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26139 Modified Files: __init__.py Added Files: file.py Log Message: file backend --- NEW FILE: file.py --- import sys, logging, md5, rfc822, poplib, time, socket try: from cStringIO import StringIO except: from StringIO import StringIO from webmail.utils.backend_helpers import MessageInfoBase from webmail.utils.expr_helper import a2bool from webmail.utils.xstrings import normalize_lines from webmail.utils.xmailbox import NetscapeMailbox log = logging.getLogger('webmail.backends.file') CR = '\r' LF = '\n' CRLF = CR+LF def _get_msgid(msg): m = md5.new() for line in msg.headers: line = line.strip(CRLF) if line is None: continue m.update(line+CRLF) m.update(CRLF) # header separator #log.debug('_get_msgid: rewindbody()') msg.rewindbody() lineno = 1 while 1: #log.debug('_get_msgid: reading line %d', lineno) line = msg.fp.readline() if not line: break #log.debug('_get_msgid: line %d = %r', lineno, line) line = line.strip(CRLF) m.update(line+CRLF) lineno = lineno+1 return m.hexdigest() class FileMessageInfo(MessageInfoBase): def __init__(self, folder, msg): msgid = _get_msgid(msg) MessageInfoBase.__init__(self, folder, msgid, msg) class FileAccountFolder: def __init__(self, account, folder_name, filename): self.parent = account self.folder = folder_name self.filename = filename self.messages = None self.deleted = None self.closed = 1 def _open(self): assert self.closed, 'Account/folder already opened' self.closed = 0 if self.messages is None or self.deleted is None: self._list() def close(self): assert not self.closed, 'Account/folder already closed' self.closed = 1 f = open(self.filename+'.del', 'wb') if self.deleted: f.write('\n'.join(self.deleted)+'\n') f.close() def _close(self): if not self.closed: self.close() self.deleted = self.messages = None def _list(self): log.info('Opening file %s', self.filename) mb = NetscapeMailbox(open(self.filename,'rb')) if self.deleted is None: try: self.deleted = filter(None, normalize_lines(open(self.filename+'.del').read()).split('\n')) except: self.deleted = [] log.info('%d deleted entries read', len(self.deleted)) messages = {} while 1: msg = mb.next() if not msg: break msginfo = FileMessageInfo(self, msg) if msginfo.uid in self.deleted: continue messages[msginfo.uid] = msginfo log.info('%d messages read', len(self.deleted)) self.messages = messages def list(self): assert not self.closed, 'Account/folder closed' self._list() return self.messages.values() def get(self, msgid): assert not self.closed, 'Account/folder closed' if self.messages is None: self._list() return self.messages[msgid].msg def delete(self, msgids): assert not self.closed, 'Account/folder closed' if type(msgids)!=type([]): raise TypeError, 'list expected, '+type(msgids).__name__+' found' if self.messages is None: self._list() for msgid in msgids: self.deleted.append(msgid) del self.messages[msgid] class FileAccount: def __init__(self, main_config, box_config): self.email = box_config['email'] self.folder_names = [None] folder_names = box_config.get('folders') if folder_names: self.folder_names.extend(folder_names.split(',')) self.folders = {} for folder_name in self.folder_names: if folder_name is None: filename = box_config['file'] else: filename = box_config['file_'+folder_name] self.folders[folder_name] = FileAccountFolder(self, folder_name, filename) self.closed = 1 def open(self): self.closed = 0 def close(self): assert not self.closed, 'Account already closed' for f in self.folders.values(): f._close() self.closed = 1 def get_inbox_name(self): return None def list(self): assert not self.closed, 'Account not yet opened' return self.folder_names def get(self, folder_name=None): assert not self.closed, 'Account not yet opened' folder = self.folders[folder_name] if folder.closed: folder._open() return folder mailbox_factory = FileAccount if __name__=='__main__': sys.stderr.write('It\'s a library, not a standalone script!\n') Index: __init__.py =================================================================== RCS file: /cvsroot/pywebmail/webmail/webmail/backends/__init__.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** __init__.py 8 Dec 2007 08:03:08 -0000 1.6 --- __init__.py 2 Mar 2008 11:06:44 -0000 1.7 *************** *** 2,6 **** def get_default_mailbox_backend(mailbox_info): ! #if mailbox_info.has_key('file'): return 'file' # not yet supported if mailbox_info.has_key('server'): host = mailbox_info['server'] --- 2,7 ---- def get_default_mailbox_backend(mailbox_info): ! if mailbox_info.has_key('file'): ! return 'file' if mailbox_info.has_key('server'): host = mailbox_info['server'] *************** *** 13,17 **** if mailbox_info.has_key('port'): port = int(mailbox_info['port']) ! if port in (25, 465, 587): return 'smtp' #if port in (143, 993): return 'imap' # imap not yet supported return 'pop3' --- 14,19 ---- if mailbox_info.has_key('port'): port = int(mailbox_info['port']) ! if port in (25, 465, 587): ! return 'smtp' #if port in (143, 993): return 'imap' # imap not yet supported return 'pop3' |