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()  | 
