diff --git a/Milter/utils.py b/Milter/utils.py index 6006b7583af72a1e9f5f9bd7ed5965044c51596d..4ae09dfa2a68483d5bd0ad9e1dfb598566b7b649 100644 --- a/Milter/utils.py +++ b/Milter/utils.py @@ -51,13 +51,28 @@ def parseaddr(t): ('Full Name', 'foo@example.com') >>> parseaddr('spam@viagra.com <foo@example.com>') ('spam@viagra.com', 'foo@example.com') + >>> parseaddr('God@heaven <@hop1.org,@hop2.net:jeff@spec.org>') + ('God@heaven', 'jeff@spec.org') """ #return email.Utils.parseaddr(t) res = rfc822.parseaddr(t) + # dirty fix for some broken cases if not res[0]: pos = t.find('<') - if pos > 0: - return rfc822.parseaddr('"%s" %s' % (t[:pos].strip(),t[pos:])) + if pos > 0 and t[-1] == '>': + addrspec = t[pos+1:-1] + pos1 = addrspec.rfind(':') + if pos1 > 0: + addrspec = addrspec[pos1+1:] + return rfc822.parseaddr('"%s" <%s>' % (t[:pos].strip(),addrspec)) + if not res[1]: + pos = t.find('<') + if pos > 0 and t[-1] == '>': + addrspec = t[pos+1:-1] + pos1 = addrspec.rfind(':') + if pos1 > 0: + addrspec = addrspec[pos1+1:] + return rfc822.parseaddr('%s<%s>' % (t[:pos].strip(),addrspec)) return res