diff options
Diffstat (limited to 'Lib/mailbox.py')
-rwxr-xr-x | Lib/mailbox.py | 480 |
1 files changed, 240 insertions, 240 deletions
diff --git a/Lib/mailbox.py b/Lib/mailbox.py index 108967d..6d5f6e4 100755 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -8,269 +8,269 @@ import os class _Mailbox: - def __init__(self, fp): - self.fp = fp - self.seekp = 0 - - def seek(self, pos, whence=0): - if whence==1: # Relative to current position - self.pos = self.pos + pos - if whence==2: # Relative to file's end - self.pos = self.stop + pos - else: # Default - absolute position - self.pos = self.start + 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)) + def __init__(self, fp): + self.fp = fp + self.seekp = 0 + + def seek(self, pos, whence=0): + if whence==1: # Relative to current position + self.pos = self.pos + pos + if whence==2: # Relative to file's end + self.pos = self.stop + pos + else: # Default - absolute position + self.pos = self.start + 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 '' - remaining = self.stop - self.pos - if length is None or length < 0: - length = remaining - elif length > remaining: - length = remaining - self.fp.seek(self.pos) - data = self.fp.read(length) - self.pos = self.fp.tell() - return data - - 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) - self.pos = self.fp.tell() - return data + 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 '' + remaining = self.stop - self.pos + if length is None or length < 0: + length = remaining + elif length > remaining: + length = remaining + self.fp.seek(self.pos) + data = self.fp.read(length) + self.pos = self.fp.tell() + return data + + 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) + self.pos = self.fp.tell() + return data def readlines(self, sizehint = -1): - lines = [] - while 1: - line = self.readline() - if not line: - break - lines.append(line) - if sizehint >= 0: - sizehint = sizehint - len(line) - if sizehint <= 0: - break - return lines - - def tell(self): - return self.pos - self.start - - def seek(self, pos, whence=0): - if whence == 0: - self.pos = self.start + pos - elif whence == 1: - self.pos = self.pos + pos - elif whence == 2: - self.pos = self.stop + pos - - def close(self): - del self.fp + lines = [] + while 1: + line = self.readline() + if not line: + break + lines.append(line) + if sizehint >= 0: + sizehint = sizehint - len(line) + if sizehint <= 0: + break + return lines + + def tell(self): + return self.pos - self.start + + def seek(self, pos, whence=0): + if whence == 0: + self.pos = self.start + pos + elif whence == 1: + self.pos = self.pos + pos + elif whence == 2: + self.pos = self.stop + pos + + def close(self): + del self.fp class UnixMailbox(_Mailbox): - def _search_start(self): - while 1: - line = self.fp.readline() - if not line: - raise EOFError - if line[:5] == 'From ' and self._isrealfromline(line): - return - - def _search_end(self): - while 1: - pos = self.fp.tell() - line = self.fp.readline() - if not line: - return - if line[:5] == 'From ' and self._isrealfromline(line): - self.fp.seek(pos) - return - - # An overridable mechanism to test for From-line-ness. - # You can either specify a different regular expression - # or define a whole new _isrealfromline() method. - # Note that this only gets called for lines starting with - # the 5 characters "From ". - - _fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \ - r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$" - _regexp = None - - def _isrealfromline(self, line): - if not self._regexp: - import re - self._regexp = re.compile(self._fromlinepattern) - return self._regexp.match(line) + def _search_start(self): + while 1: + line = self.fp.readline() + if not line: + raise EOFError + if line[:5] == 'From ' and self._isrealfromline(line): + return + + def _search_end(self): + while 1: + pos = self.fp.tell() + line = self.fp.readline() + if not line: + return + if line[:5] == 'From ' and self._isrealfromline(line): + self.fp.seek(pos) + return + + # An overridable mechanism to test for From-line-ness. + # You can either specify a different regular expression + # or define a whole new _isrealfromline() method. + # Note that this only gets called for lines starting with + # the 5 characters "From ". + + _fromlinepattern = r"From \s*[^\s]+\s+\w\w\w\s+\w\w\w\s+\d?\d\s+" \ + r"\d?\d:\d\d(:\d\d)?(\s+[^\s]+)?\s+\d\d\d\d\s*$" + _regexp = None + + def _isrealfromline(self, line): + if not self._regexp: + import re + self._regexp = re.compile(self._fromlinepattern) + return self._regexp.match(line) 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 + 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 class MHMailbox: - def __init__(self, dirname): - import re - pat = re.compile('^[0-9][0-9]*$') - self.dirname = dirname - files = os.listdir(self.dirname) - self.boxes = [] - for f in files: - if pat.match(f): - self.boxes.append(f) - - def next(self): - if not self.boxes: - return None - fn = self.boxes[0] - del self.boxes[0] - fp = open(os.path.join(self.dirname, fn)) - return rfc822.Message(fp) + def __init__(self, dirname): + import re + pat = re.compile('^[0-9][0-9]*$') + self.dirname = dirname + files = os.listdir(self.dirname) + self.boxes = [] + for f in files: + if pat.match(f): + self.boxes.append(f) + + def next(self): + if not self.boxes: + return None + fn = self.boxes[0] + del self.boxes[0] + fp = open(os.path.join(self.dirname, fn)) + return rfc822.Message(fp) class Maildir: - # Qmail directory mailbox - - def __init__(self, dirname): - import string - self.dirname = dirname - self.boxes = [] - - # check for new mail - newdir = os.path.join(self.dirname, 'new') - for file in os.listdir(newdir): - if len(string.split(file, '.')) > 2: - self.boxes.append(os.path.join(newdir, file)) - - # Now check for current mail in this maildir - curdir = os.path.join(self.dirname, 'cur') - for file in os.listdir(curdir): - if len(string.split(file, '.')) > 2: - self.boxes.append(os.path.join(curdir, file)) - - def next(self): - if not self.boxes: - return None - fn = self.boxes[0] - del self.boxes[0] - fp = open(os.path.join(self.dirname, fn)) - return rfc822.Message(fp) + # Qmail directory mailbox + + def __init__(self, dirname): + import string + self.dirname = dirname + self.boxes = [] + + # check for new mail + newdir = os.path.join(self.dirname, 'new') + for file in os.listdir(newdir): + if len(string.split(file, '.')) > 2: + self.boxes.append(os.path.join(newdir, file)) + + # Now check for current mail in this maildir + curdir = os.path.join(self.dirname, 'cur') + for file in os.listdir(curdir): + if len(string.split(file, '.')) > 2: + self.boxes.append(os.path.join(curdir, file)) + + def next(self): + if not self.boxes: + return None + fn = self.boxes[0] + del self.boxes[0] + fp = open(os.path.join(self.dirname, fn)) + return rfc822.Message(fp) class BabylMailbox(_Mailbox): - def _search_start(self): - while 1: - line = self.fp.readline() - if not line: - raise EOFError - if line == '*** EOOH ***\n': - return - - def _search_end(self): - while 1: - pos = self.fp.tell() - line = self.fp.readline() - if not line: - return - if line == '\037\014\n': - self.fp.seek(pos) - return + def _search_start(self): + while 1: + line = self.fp.readline() + if not line: + raise EOFError + if line == '*** EOOH ***\n': + return + + def _search_end(self): + while 1: + pos = self.fp.tell() + line = self.fp.readline() + if not line: + return + if line == '\037\014\n': + self.fp.seek(pos) + return def _test(): - import time - import sys - import string - import os - - args = sys.argv[1:] - if not args: - for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER': - if os.environ.has_key(key): - mbox = os.environ[key] - break - else: - print "$MAIL, $LOGNAME nor $USER set -- who are you?" - return - else: - mbox = args[0] - if mbox[:1] == '+': - mbox = os.environ['HOME'] + '/Mail/' + mbox[1:] - elif not '/' in mbox: - mbox = '/usr/mail/' + mbox - if os.path.isdir(mbox): - if os.path.isdir(os.path.join(mbox, 'cur')): - mb = Maildir(mbox) - else: - mb = MHMailbox(mbox) - else: - fp = open(mbox, 'r') - mb = UnixMailbox(fp) - - msgs = [] - while 1: - msg = mb.next() - if msg is None: - break - msgs.append(msg) - if len(args) <= 1: - msg.fp = None - if len(args) > 1: - num = string.atoi(args[1]) - print 'Message %d body:'%num - msg = msgs[num-1] - msg.rewindbody() - sys.stdout.write(msg.fp.read()) - else: - print 'Mailbox',mbox,'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 %18.18s %-30.30s'%(f, d[5:], s) + import time + import sys + import string + import os + + args = sys.argv[1:] + if not args: + for key in 'MAILDIR', 'MAIL', 'LOGNAME', 'USER': + if os.environ.has_key(key): + mbox = os.environ[key] + break + else: + print "$MAIL, $LOGNAME nor $USER set -- who are you?" + return + else: + mbox = args[0] + if mbox[:1] == '+': + mbox = os.environ['HOME'] + '/Mail/' + mbox[1:] + elif not '/' in mbox: + mbox = '/usr/mail/' + mbox + if os.path.isdir(mbox): + if os.path.isdir(os.path.join(mbox, 'cur')): + mb = Maildir(mbox) + else: + mb = MHMailbox(mbox) + else: + fp = open(mbox, 'r') + mb = UnixMailbox(fp) + + msgs = [] + while 1: + msg = mb.next() + if msg is None: + break + msgs.append(msg) + if len(args) <= 1: + msg.fp = None + if len(args) > 1: + num = string.atoi(args[1]) + print 'Message %d body:'%num + msg = msgs[num-1] + msg.rewindbody() + sys.stdout.write(msg.fp.read()) + else: + print 'Mailbox',mbox,'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 %18.18s %-30.30s'%(f, d[5:], s) if __name__ == '__main__': - _test() + _test() |