Kaydet (Commit) 3534a893 authored tarafından Guido van Rossum's avatar Guido van Rossum

New, improved parseaddr() by Sjoerd.

üst 7698d12a
...@@ -297,35 +297,88 @@ def unquote(str): ...@@ -297,35 +297,88 @@ def unquote(str):
# Parse an address into (name, address) tuple # Parse an address into (name, address) tuple
def parseaddr(address): def parseaddr(address):
# This is probably not perfect import string
address = string.strip(address) str = ''
# Case 1: part of the address is in <xx@xx> form. email = ''
pos = regex.search('<.*>', address) comment = ''
if pos >= 0: backslash = 0
name = address[:pos] dquote = 0
address = address[pos:] space = 0
length = regex.match('<.*>', address) paren = 0
name = name + address[length:] bracket = 0
address = address[:length] seen_bracket = 0
else: for c in address:
# Case 2: part of the address is in (comment) form if backslash:
pos = regex.search('(.*)', address) str = str + c
if pos >= 0: backslash = 0
name = address[pos:] continue
address = address[:pos] if c == '\\':
length = regex.match('(.*)', name) backslash = 1
address = address + name[length:] continue
name = name[:length] if dquote:
if c == '"':
dquote = 0
else:
str = str + c
continue
if c == '"':
dquote = 1
continue
if c in string.whitespace:
space = 1
continue
if space:
str = str + ' '
space = 0
if paren:
if c == '(':
paren = paren + 1
str = str + c
continue
if c == ')':
paren = paren - 1
if paren == 0:
comment = comment + str
str = ''
continue
if c == '(':
paren = paren + 1
if bracket:
email = email + str
str = ''
elif not seen_bracket:
email = email + str
str = ''
continue
if bracket:
if c == '>':
bracket = 0
email = email + str
str = ''
continue
if c == '<':
bracket = 1
seen_bracket = 1
comment = comment + str
str = ''
email = ''
continue
if c == '#' and not bracket and not paren:
# rest is comment
break
str = str + c
if str:
if seen_bracket:
if bracket:
email = str
else:
comment = comment + str
else: else:
# Case 3: neither. Only an address if paren:
name = '' comment = comment + str
name = string.strip(name) else:
address = string.strip(address) email = email + str
if address and address[0] == '<' and address[-1] == '>': return string.strip(comment), string.strip(email)
address = address[1:-1]
if name and name[0] == '(' and name[-1] == ')':
name = name[1:-1]
return name, address
# Parse a date field # Parse a date field
...@@ -376,8 +429,8 @@ def parsedate(data): ...@@ -376,8 +429,8 @@ def parsedate(data):
# message in RFC-822 format. # message in RFC-822 format.
if __name__ == '__main__': if __name__ == '__main__':
import sys import sys, os
file = '/ufs/guido/Mail/drafts/,1' file = os.path.join(os.environ['HOME'], 'Mail/drafts/,1')
if sys.argv[1:]: file = sys.argv[1] if sys.argv[1:]: file = sys.argv[1]
f = open(file, 'r') f = open(file, 'r')
m = Message(f) m = Message(f)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment