diff --git a/Milter/utils.py b/Milter/utils.py
index 68496b7c49e130db3f56eb49e329716784eeb80a..6006b7583af72a1e9f5f9bd7ed5965044c51596d 100644
--- a/Milter/utils.py
+++ b/Milter/utils.py
@@ -4,6 +4,8 @@ import socket
 import email.Errors
 from fnmatch import fnmatchcase
 from email.Header import decode_header
+#import email.Utils
+import rfc822
 
 ip4re = re.compile(r'^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$')
 
@@ -40,6 +42,25 @@ def iniplist(ipaddr,iplist):
       return True
   return False
 
+def parseaddr(t):
+  """Split email into Fullname and address.
+
+  >>> parseaddr('user@example.com')
+  ('', 'user@example.com')
+  >>> parseaddr('"Full Name" <foo@example.com>')
+  ('Full Name', 'foo@example.com')
+  >>> parseaddr('spam@viagra.com <foo@example.com>')
+  ('spam@viagra.com', 'foo@example.com')
+  """
+  #return email.Utils.parseaddr(t)
+  res = rfc822.parseaddr(t)
+  if not res[0]:
+    pos = t.find('<')
+    if pos > 0:
+      return rfc822.parseaddr('"%s" %s' % (t[:pos].strip(),t[pos:]))
+  return res
+    
+
 def parse_addr(t):
   """Split email into user,domain.
 
diff --git a/TODO b/TODO
index 76de62c5fd20f97322493a0524642517e2cf3102..fca32934e830586535f0e03df6450082facb438b 100644
--- a/TODO
+++ b/TODO
@@ -1,3 +1,8 @@
+Add parseaddr test case for 'foo@bar.com <baz@barf.biz>'
+
+Check ESMTP NOTIFY before sending real DSNs.  Just use CBV if DSNs are
+not wanted.
+
 Support CBV to local domains and cache results so that invalid users
 can be rejected without maintaining valid user lists.
 
diff --git a/bms.py b/bms.py
index 084afc5a0a6c80a8b4997316d665383fe283e0bf..f52d28366bd65ed8a5465707a66dcb170441d52d 100644
--- a/bms.py
+++ b/bms.py
@@ -1,6 +1,9 @@
 #!/usr/bin/env python
 # A simple milter that has grown quite a bit.
 # $Log$
+# Revision 1.117  2007/11/29 14:35:17  customdesigned
+# Packaging tweaks.
+#
 # Revision 1.116  2007/11/01 20:09:14  customdesigned
 # Support temperror policy in access.
 #
@@ -171,11 +174,12 @@ import gc
 import anydbm
 import Milter.dsn as dsn
 from Milter.dynip import is_dynip as dynip
-from Milter.utils import iniplist,parse_addr,parse_header,ip4re,addr2bin
+from Milter.utils import \
+        iniplist,parse_addr,parse_header,ip4re,addr2bin,parseaddr
 from Milter.config import MilterConfigParser
 
 from fnmatch import fnmatchcase
-from email.Utils import getaddresses,parseaddr
+from email.Utils import getaddresses
 
 # Import gossip if available
 try:
@@ -563,7 +567,7 @@ class SPFPolicy(object):
 from Milter.cache import AddrCache
 
 cbv_cache = AddrCache(renew=7)
-auto_whitelist = AddrCache(renew=30)
+auto_whitelist = AddrCache(renew=60)
 blacklist = AddrCache(renew=30)
 
 class bmsMilter(Milter.Milter):