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

在django/python中检查电子邮件的有效性,python,regex,django,validation,email,Python,Regex,Django,Validation,Email,我已经写了一个功能添加电子邮件到时事通讯基地。在我添加了检查发送电子邮件的有效性之前,它工作得完美无缺。现在每次我收到“错误的电子邮件”作为回报。有人能看到这里有什么错误吗?使用的正则表达式是: \b[\w\.-]+@[\w\.-]+.\w{2,4}\b并且它是100%有效的(),但我可能用错了,或者它可能是一些逻辑错误: def newsletter_add(request): if request.method == "POST": try:

我已经写了一个功能添加电子邮件到时事通讯基地。在我添加了检查发送电子邮件的有效性之前,它工作得完美无缺。现在每次我收到“错误的电子邮件”作为回报。有人能看到这里有什么错误吗?使用的正则表达式是:

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

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

请不要自己验证电子邮件地址。这是人们永远不会做对的事情之一

既然您已经在使用Django,那么您最安全的选择就是利用它对电子邮件的表单验证。根据:


你搞错了,但这是一项你无论如何都无法完成的任务。要知道地址是否有效,只有一种方法,那就是向地址发送邮件并获得回复。做任何其他事情都不会提高数据的信息含量,哪怕是一点点

您还需要考虑人为因素和验收属性,因为当您提供

me+valid@mydomain.example.net
你告诉我我出错了,我就跟你的申请说再见

2017年更新:下面的代码已有7年历史,并且已经过修改、修复和扩展。对于希望立即执行此操作的任何人,正确的代码就在这里:

以下是您可能会感兴趣的django.core.validators的一部分:)

因此,如果您不想使用表单和表单字段,您可以导入
email\u re
并在功能中使用它,或者更好地导入
validate\u 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中。

改变你的代码:

重新匹配('\b[\w.-]+@[\w.-]+.\w{2,4}\b',电子邮件)

为此:

重新匹配(r'\b[\w.-]+@[\w.-]+.\w{2,4}\b',电子邮件)


对我来说很好。

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

from django.core.exceptions import ValidationError
from django.core.validators import validate_email

value = "foo.bar@baz.qux"

try:
    validate_email(value)
except ValidationError as e:
    print("bad email, details:", e)
else:
    print("good email")
\w[\w\.-]*@\w[\w\.-]+\.\w+

它允许使用字母数字字符,
\uuu
-
我可以看到这里的许多答案都基于python的django框架。但是为了验证电子邮件地址,为什么要安装这么重的软件。我们有用于Python的Validate_电子邮件包,用于检查电子邮件是否有效、格式是否正确以及是否确实存在。它是一个重量轻的包装(尺寸<1MB)

安装:

pip install validate_email
基本用法:

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

from validate_email import validate_email
is_valid = validate_email('example@example.com')
要检查域mx并验证电子邮件是否存在,您可以安装pyDNS包以及validate_电子邮件

验证电子邮件是否存在:

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


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

幸运的是,此正则表达式不是我的:)因此,您也支持普通的EmailField方法?我不会说django,但此参数适用于任何语法验证地址的尝试。看起来连EmailField都不能胜任这项任务(但我看起来并不是很努力),自07/04/07以来,特定的票据被标记为已修复,并且在unicode处理翻译错误消息时存在错误。我认为现在使用Django验证器是相对安全的。谢谢,我们已经导入了email_re(这是web上的代码片段),但是您的第二个代码块完成了这个技巧。这对于即将推出的新顶级域扩展不再有效(我认为扩展超过6个字符)我相信
email\u re
表达式中可能存在错误。特别是在引用的字符串行中,我猜测其意图是
\001-011
实际上应该是
\001-\011
。有什么想法吗?事实上,上面的代码有输入错误。github上的源代码已经修复:对复制和粘贴该正则表达式的人发出了公平警告。更新部分是最好的部分:D.只需使用
isEmailAddressValid(address)
执行验证。因为问题是关于Django的,所以这是最好的答案+1鼓励代码重用和简单。简单比复杂好,非常好的解释100%有效?不匹配
foo+bar@example.com
,将不匹配
foo@museum.com
,吨以上。100%有效吗?您的正则表达式将匹配
a…@………..a
。实际上@Kos@Zenadix…关于
\b[\w\.-]+@[\w\.-]+.\w{2,4}\b
正则表达式,你们两个都是错误的。我刚刚测试了它,结果与你们说的正好相反。这个解决方案在最初提出问题时不可用,但绝对是最好的答案。而且在2017年仍然是最好的答案。。!期待2018年。。!根据当前流程,这应该是绝对可以接受的答案。最佳答案是2018年和2019年。展望2020年。
因为这里实际上不需要e
,除非您计划使用
e
。我相信这不适用于python 3,而仅适用于python 2。
from validate_email import validate_email
is_valid = validate_email('example@example.com')
from validate_email import validate_email
is_valid = validate_email('example@example.com',verify=True)