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):