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

时间:2010-07-10 03:21:15

标签: python regex django validation email

我编写了一个向电子报添加电子邮件的功能。直到我添加检查已发送电子邮件的有效性,它才能完美运行。现在,每次我收到“错误的电子邮件”作为回报。任何人都可以在这看到任何错误吗?使用的正则表达式是:

\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

7 个答案:

答案 0 :(得分:143)

  

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

因此,如果您不想使用表单和表单字段,则可以导入email_re并在函数中使用它,甚至更好 - 导入validate_email并使用它,捕捉可能的{{} 1}}。

ValidationError

如果你真的需要成为那种偏执狂,那么PERL中会使用Mail::RFC822::Address regexp

答案 1 :(得分:116)

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"

答案 2 :(得分:48)

Ick,不,请不要自己尝试验证电子邮件地址。这是人们永远无法做到的事情之一。

您最安全的选择,因为您已经在使用Django,只是利用其对电子邮件的表单验证。根据文档(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.']

答案 3 :(得分:7)

你弄错了,但这是一项你不能做的任务。有一种方法可以知道RFC 2822地址是否有效,那就是向其发送邮件并获得响应。做其他任何事情都不会改善你的数据的信息内容甚至是一小部分。

当您提供validateEmail我的

地址时,您还会使用人为因素和接受属性
me+valid@mydomain.example.net

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

答案 4 :(得分:1)

此正则表达式将以合理的准确度验证电子邮件地址。

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

它允许使用字母数字字符,_.-

答案 5 :(得分:1)

我可以看到许多答案都基于django的python框架。但是对于验证电子邮件地址,为什么要安装如此繁重的软件。我们有适用于Python的Validate_email软件包,用于检查电子邮件是否有效,格式正确以及是否确实存在。它是一个轻巧的包装(大小<1MB)。

安装:

val df = Seq(
(2.0, true, "1", "foo"),
(3.0, false, "2", "bar")
).toDF("real", "bool", "stringNum", "string")

val hasher = new FeatureHasher()
 .setInputCols("real", "bool", "stringNum", "string")
 .setOutputCol("features")

hasher.transform(df).show(false)

 +----+-----+---------+------+---------------------------------------------- 
 --------+
 |real|bool |stringNum|string|features                                              
 |
 +----+-----+---------+------+---------------------------------------------- 
  --------+
 |2.0 |true |1        |foo   |(262144,[51871,63643,174475,253195], 
                                [1.0,1.0,2.0,1.0])|
 |3.0 |false|2        |bar   |(262144,[6031,80619,140467,174475], 
                               [1.0,1.0,1.0,3.0]) |
 +----+-----+---------+------+---------------------------------------------- 
  --------+

基本用法:

检查电子邮件格式是否正确。

pip install validate_email

要检查域mx并验证电子邮件是否存在,可以将pyDNS软件包与validate_email一起安装。

验证电子邮件是否存在:

from validate_email import validate_email
is_valid = validate_email('example@example.com')

如果电子邮件存在于现实世界中,则返回True,否则返回False。

答案 6 :(得分:0)

从此处更改您的代码:

  

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

到此:

  

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

和我一起工作。