From 017784b5a78d88485318fc4035051578110d2f58 Mon Sep 17 00:00:00 2001
From: Stuart Gathman <stuart@gathman.org>
Date: Thu, 10 Jan 2008 16:41:04 +0000
Subject: [PATCH] Handle multi-hop source path in parseaddr.

---
 Milter/utils.py | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/Milter/utils.py b/Milter/utils.py
index 6006b75..4ae09df 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
     
 
-- 
GitLab