Thanks! I spent a bit of time refactoring it. Also, I decided that if it worked it would return the address, otherwise it would return None to indicate failure. import re def ShouldBeNone(result): return result is not None def ShouldNotBeNone(result): return result is None tests = ( (re.compile("^[0-9a-zA-Z\.\-\_]+\@[0-9a-zA-Z\.\-]+$"), ShouldNotBeNone, "Failed a"), (re.compile("^[^0-9a-zA-Z]|[^0-9a-zA-Z]$"), ShouldBeNone, "Failed b"), (re.compile("([0-9a-zA-Z]{1})\@."), ShouldNotBeNone, "Failed c"), (re.compile(".\@([0-9a-zA-Z]{1})"), ShouldNotBeNone, "Failed d"), (re.compile(".\.\-.|.\-\..|.\.\..|.\-\-."), ShouldBeNone, "Failed e"), (re.compile(".\.\_.|.\-\_.|.\_\..|.\_\-.|.\_\_."), ShouldBeNone, "Failed f"), (re.compile(".\.([a-zA-Z]{2,3})$|.\.([a-zA-Z]{2,4})$"), ShouldNotBeNone, "Failed g"), ) def valid_email(address, debug=None): for test in tests: if test[1](test[0].search(address)): if debug: return test[2] return None return address def tryAddress(address): print address, valid_email(address, debug=1) if __name__ == '__main__': #test a few: tryAddress('z+z.e@bun.org') tryAddress('z.e@.org') tryAddress('_az.e@bun.org') tryAddress('e@b.g') tryAddress('a_-.e@bun.org') tryAddress('ok.computer@-bun.org') tryAddress('ok.e@bun.org') tryAddress('OK@bun.org') tryAddress('t@bun.info') tryAddress('my friend@bun.org') tryAddress('my.friend.bun.org') *********** REPLY SEPARATOR *********** On 11/24/01 at 1:12 PM Jim Washington wrote:
Barry A. Warsaw wrote:
>"BE" == Bruce Eckel <Bruce@EckelObjects.com> writes: >
BE> Worked like a charm! It turns out I was handing it an invalid BE> "from" email address.
BE> Which brings up another question -- is there a piece of code BE> that will validate email addresses somewhere? Seems like it BE> would be a common tool (I'll bet the spammers have it!).
Do you mean you want to find out if a string looks like a valid email address, or that it actually successfully delivers to some end destination? The former is doable, the latter is exceedingly difficult!
Mailman has the following bit of code, which accomplishes the goal set out in its docstring <wink>:
I hadn't thought of looking through mailman. Here's one I put together a couple of weeks ago that seems a bit more thorough...
-- Jim Washington
# This is hacked from an existing script written in perl, licensed "public domain" # The original perl script: http://aspn.activestate.com/ASPN/Cookbook/Rx/Recipe/68432 2Nov2001 # author e-mail: tbyte@bolehmail.com
""" Text of the perl script:
sub ValidEmailAddr { #check if e-mail address format is valid
my $mail = shift; #in form name@host
return 0 if ( $mail !~ /^[0-9a-zA-Z\.\-\_]+\@[0-9a-zA-Z\.\-]+$/ ); #characters allowed on name: 0-9a-Z-._ on host: 0-9a-Z-. on between: @ return 0 if ( $mail =~ /^[^0-9a-zA-Z]|[^0-9a-zA-Z]$/); #must start or end with alpha or num return 0 if ( $mail !~ /([0-9a-zA-Z]{1})\@./ ); #name must end with alpha or num return 0 if ( $mail !~ /.\@([0-9a-zA-Z]{1})/ ); #host must start with alpha or num return 0 if ( $mail =~ /.\.\-.|.\-\..|.\.\..|.\-\-./g ); #pair .- or -. or -- or .. not allowed return 0 if ( $mail =~ /.\.\_.|.\-\_.|.\_\..|.\_\-.|.\_\_./g ); #pair ._ or -_ or _. or _- or __ not allowed return 0 if ( $mail !~ /\.([a-zA-Z]{2,3})$/ ); #host must end with '.' plus 2 or 3 alpha for TopLevelDomain (MUST be modified in future!)
return 1; }
e-mail checker, checks whether an e-mail address is formatted properly. usage:
from email_checker import valid_email
s = "string to be tested" if valid_email(s): do_something() else: do something_else()
"""
import re
rega = re.compile("^[0-9a-zA-Z\.\-\_]+\@[0-9a-zA-Z\.\-]+$") #failure a regb = re.compile("^[^0-9a-zA-Z]|[^0-9a-zA-Z]$") #failure b regc = re.compile("([0-9a-zA-Z]{1})\@.") #failure c regd = re.compile(".\@([0-9a-zA-Z]{1})") #failure d rege = re.compile(".\.\-.|.\-\..|.\.\..|.\-\-.") #failure e regf = re.compile(".\.\_.|.\-\_.|.\_\..|.\_\-.|.\_\_.") #failure f regg = re.compile(".\.([a-zA-Z]{2,3})$|.\.([a-zA-Z]{2,4})$")#failure g
def valid_email(address, debug=None): fail = None if rega.search(address) is None: fail = 'a' elif regb.search(address) is not None: fail = 'b' elif regc.search(address) is None: fail = 'c' elif regd.search(address) is None: fail = 'd' elif rege.search(address) is not None: fail = 'e' elif regf.search(address) is not None: fail = 'f' elif regg.search(address) is None: fail = 'g' if fail is not None: if debug: return address,fail,None else: return None if debug: return address,1,1 else: return 1
if __name__ == '__main__': #test a few: print valid_email('z+z.e@bun.org', debug=1) print valid_email('z.e@.org', debug=1) print valid_email('_az.e@bun.org', debug=1) print valid_email('e@b.g', debug=1) print valid_email('a_-.e@bun.org', debug=1) print valid_email('ok.computer@-bun.org', debug=1) print valid_email('ok.e@bun.org', debug=1) print valid_email('OK@bun.org', debug=1) print valid_email('t@bun.info', debug=1) print valid_email('my friend@bun.org', debug=1) print valid_email('my.friend.bun.org', debug=1)
Most current information can be found at: http://www.mindview.net/Etc/notes.html =================== Bruce Eckel http://www.BruceEckel.com Contains free electronic books: "Thinking in Java 2e" & "Thinking in C++ 2e" Please subscribe to my free newsletter -- just send any email to: join-eckel-oo-programming@earth.lyris.net My schedule can be found at: http://www.mindview.net/Calendar ===================