在django / python中检查电子邮件的有效性

我已经写了一个函数来添加电子邮件通讯基地。 直到我已经添加检查发送的电子邮件的有效性它完美地工作。 现在,每次我收到“错误的电子邮件”。 任何人都可以在这里看到任何错误? 使用的正则expression式是:

\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b并且它是100%有效的( http://gskinner.com/RegExr/ )我可能会用错,或者可能是一些逻辑错误:

 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 

更新2017年 :下面的代码是7岁,自修改,固定和扩大。 对于现在想要这样做的人来说,正确的代码就在这里: https : //github.com/django/django/blob/master/django/core/validators.py#L168-L180

这里是你可能会发现有趣的django.core.validators的一部分:)

 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])?\.)+[AZ]{2,6}\.?$', re.IGNORECASE) # domain validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid') 

所以如果你不想使用表单和表单字段,你可以导入email_re ,并在你的函数中使用它,甚至更好 – 导入validate_email并使用它,捕获可能的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 

如果你确实需要这个偏执狂,那么这里是在PERL中使用的Mail :: RFC822 :: Address regexp 。

 from django.core.exceptions import ValidationError from django.core.validators import validate_email try: validate_email("foo.bar@baz.qux") except ValidationError as e: print "oops! wrong email" else: print "hooray! email is valid" 

Ick,不,请不要尝试自己validation电子邮件地址。 这是人们从来没有做的事情之一。

你最安全的select,因为你已经使用Django,只是利用其电子邮件的formsvalidation。 根据文档( http://docs.djangoproject.com/en/dev/ref/forms/fields/ ):

 >>> from django import forms >>> f = forms.EmailField() >>> f.clean('foo@example.com') u'foo@example.com' >>> f.clean(u'foo@example.com') u'foo@example.com' >>> f.clean('invalid e-mail address') ... ValidationError: [u'Enter a valid e-mail address.'] 

你弄错了,但是这是一个你不能做的任务。 有一个唯一的方法可以知道RFC 2822的地址是否有效,也就是发送邮件并得到响应。 做任何事情都不能改善你的数据的信息内容,甚至是一点点。

你也拧人的因素和接受财产,因为当你给validateEmail我的地址

 me+valid@mydomain.example.net 

你告诉我我犯了一个错误,我告诉你的应用程序再见。

改变你的代码:

re.match('\ b [\ w .-] + @ [\ w .-] +。\ w {2,4} \ b',email)

对此:

re.match(r'\ b [\ w .-] + @ [\ w .-] +。\ w {2,4} \ b',email)

对我很好。

这个正则expression式将以合理的准确性validation电子邮件地址。

 \w[\w\.-]*@\w[\w\.-]+\.\w+ 

它允许字母数字字符, _-