["python","regex","django","validation","email"]
How to validate an Email address in Django?

I have written a function for adding emails to newsletter base. Until I've added checking validity of sent email it was working flawlessly. Now each time I'm getting "Wrong email" in return. Can anybody see any errors here ? The regex used is : \b[\w\.-]+@[\w\.-]+\.\w{2,4}\b and it is 100% valid (http://gskinner.com/RegExr/), but I may be using it wrong, or it may be some logic error : def newsletter_add(request): if request.method == "POST": try: e = NewsletterEmails.objects.get(email = request.POST['email']) message = _(u"Email is already added.") type = "error" except NewsletterEmails.DoesNotExist: if validateEmail(request.POST['email']): try: e = NewsletterEmails(email = request.POST['email']) except DoesNotExist: pass message = _(u"Email added.") type = "success" e.save() else: message = _(u"Wrong email") type = "error" import re def validateEmail(email): if len(email) > 6: if re.match('\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b', email) != None: return 1 return 0
UPDATE 2017: the code below is 7 years old and was since modified, fixed and expanded. For anyone wishing to do this now, the correct code lives around here. Here is part of django.core.validators you may find interesting :) class EmailValidator(RegexValidator): def __call__(self, value): try: super(EmailValidator, self).__call__(value) except ValidationError, e: # Trivial case failed. Try for possible IDN domain-part if value and u'@' in value: parts = value.split(u'@') domain_part = parts[-1] try: parts[-1] = parts[-1].encode('idna') except UnicodeError: raise e super(EmailValidator, self).__call__(u'@'.join(parts)) else: raise email_re = re.compile( r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" # dot-atom r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string r')@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?$', re.IGNORECASE) # domain validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid') so if you don't want to use forms and form fields, you can import email_re and use it in your function, or even better - import validate_email and use it, catching possible ValidationError. def validateEmail( email ): from django.core.validators import validate_email from django.core.exceptions import ValidationError try: validate_email( email ) return True except ValidationError: return False And here is Mail::RFC822::Address regexp used in PERL, if you really need to be that paranoid.