Message.getaddrlist(): This now handles multiple occurances of the

named header, so that if a message has, e.g. multiple CC: lines, all
will get returned by the call to getaddrlist().  It also correctly
handles addresses which show up in continuation lines.

AdderlistClass.__init__(): Added \n to self.CR which fixes a bug that
sometimes, an address would contain a bogus trailing newline.

Message.getaddress(): In final else clause, added a test for the
character we're at being in self.specials.  Without this, such
characters never get consumed and we infloop.  Case in point (as
posted to c.l.py):

To: <[smtp:dd47@mail.xxx.edu]_at_hmhq@hdq-mdm1-imgout.companay.com>
----------------------------^
otherwise we'd infloop here
This commit is contained in:
Barry Warsaw 1999-01-14 19:59:58 +00:00
parent f8ebb5521d
commit 8a578436f4
1 changed files with 21 additions and 12 deletions

View File

@ -299,15 +299,24 @@ class Message:
def getaddrlist(self, name):
"""Get a list of addresses from a header.
Retrieves a list of addresses from a header, where each
address is a tuple as returned by getaddr().
Retrieves a list of addresses from a header, where each address is a
tuple as returned by getaddr(). Scans all named headers, so it works
properly with multiple To: or Cc: headers for example.
"""
# New, by Ben Escoto
try:
data = self[name]
except KeyError:
return []
a = AddrlistClass(data)
raw = []
for h in self.getallmatchingheaders(name):
if h[0] in ' \t':
raw.append(h)
else:
if raw:
raw.append(', ')
i = string.find(h, ':')
if i > 0:
addr = h[i+1:]
raw.append(addr)
alladdrs = string.join(raw, '')
a = AddrlistClass(alladdrs)
return a.getaddrlist()
def getdate(self, name):
@ -465,9 +474,8 @@ class AddrlistClass:
self.specials = '()<>@,:;.\"[]'
self.pos = 0
self.LWS = ' \t'
self.CR = '\r'
self.CR = '\r\n'
self.atomends = self.specials + self.LWS + self.CR
self.field = field
self.commentlist = []
@ -539,6 +547,8 @@ class AddrlistClass:
else:
if plist:
returnlist = [(string.join(self.commentlist), plist[0])]
elif self.field[self.pos] in self.specials:
self.pos = self.pos + 1
self.gotonext()
if self.pos < len(self.field) and self.field[self.pos] == ',':
@ -618,7 +628,6 @@ class AddrlistClass:
elif self.field[self.pos] in self.atomends:
break
else: sdlist.append(self.getatom())
return string.join(sdlist, '')
def getdelimited(self, beginchar, endchars, allowcomments = 1):