]> granicus.if.org Git - python/commitdiff
UnixMailbox: don't be fooled by lines that begin with "From " but
authorGuido van Rossum <guido@python.org>
Fri, 3 Apr 1998 16:04:05 +0000 (16:04 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 3 Apr 1998 16:04:05 +0000 (16:04 +0000)
otherwise don't look like headers at all...
Also robustify the test code a bit.

Lib/mailbox.py

index d1315d0b894388dc598ff36a484abcd7f92a32d2..dd8e5e1dbaba9f4e7acd937729a4e7d82f8dcabf 100755 (executable)
@@ -85,7 +85,7 @@ class UnixMailbox(_Mailbox):
                        line = self.fp.readline()
                        if not line:
                                raise EOFError
-                       if line[:5] == 'From ':
+                       if line[:5] == 'From ' and self._isrealfromline(line):
                                return
 
        def _search_end(self):
@@ -94,10 +94,26 @@ class UnixMailbox(_Mailbox):
                        line = self.fp.readline()
                        if not line:
                                return
-                       if line[:5] == 'From ':
+                       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):
@@ -190,7 +206,7 @@ def _test():
        msgs = []
        while 1:
                msg = mb.next()
-               if not msg:
+               if msg is None:
                        break
                msgs.append(msg)
                msg.fp = None
@@ -203,9 +219,9 @@ def _test():
        else:
                print 'Mailbox',mbox,'has',len(msgs),'messages:'
                for msg in msgs:
-                       f = msg.getheader('from')
-                       s = msg.getheader('subject')
-                       d = (msg.getheader('date'))
+                       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)