python使用正则验证电子邮件_关于正则表达式:在django / python中检查电子邮件的有效性...

这篇博客讨论了在Django中使用正则表达式验证电子邮件地址的有效性。作者遇到问题并分享了他们的代码,同时引用了Django源代码中的电子邮件验证方法,并建议使用内置的validate_email功能进行更准确的验证。
摘要由CSDN通过智能技术生成

本问题已经有最佳答案,请猛点这里访问。

我已经编写了一个向时事通讯库添加电子邮件的函数。直到我添加了检查已发送电子邮件的有效性,它才能完美地工作。现在,每次我收到"错误的电子邮件"作为回报。有人能在这里看到任何错误吗?使用的regex是:

EDCOX1,0,它是100%有效的(http://gSnnn.com/ReGeRr/),但是我可能使用它错误,或者它可能是一些逻辑错误:

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

100%有效吗?不匹配foo+bar@example.com,不匹配foo@museum.com,以及更多吨。

100%有效吗?您的regex将与a..@..............a匹配。

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: https://github.com/django/django/blob/master/django/core/validators.py#L168-L180

下面是django.core.validator的一部分,您可能会发现它很有趣:)

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并使用它,捕获可能的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

这里是mail::rfc822::address regexp,在Perl中使用,如果您真的需要这样的偏执狂的话。

谢谢,有一个电子邮件导入(这是整个网络的一个片段),但你的第二个代码块成功了

对于即将到来的新顶级域扩展(我认为扩展超过6个字符)mashable.com/2011/06/21/icann-top-level-domains-change,这不再有效。

我相信在email_re表达式中可能有一个错误。具体地说,在引用的字符串行中,我猜目的是\001-011实际上应该是\001-\011。有什么想法吗?

实际上,上面的代码中有一个拼写错误。GitHub上的源代码已经修复:github.com/django/django/blob/master/django/core/validators.‌&8203;复制和粘贴该regex的人收到公平警告。

更新部分是最好的部分。D

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"

这个解决方案在最初提出问题时不可用,但绝对是最佳答案。

还是2017年最好的答案。转发至2018年….!这应该是根据当前流确定接受的答案。

2018年和2019年最佳答案。到2020年。

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

因为您已经在使用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.']

这里有一个基于此方法的微小的python模块。只需使用isEmailAddressValid(address)进行验证即可。

既然问题是关于姜戈的,这是最好的答案。+1用于鼓励代码重用和简单性。

简单胜于复杂,很好的解释

你搞错了,但这是你无论如何都做不到的任务。知道RFC2822地址是否有效只有一种方法,那就是向它发送邮件并得到响应。做任何其他的事情都不会提高数据的信息内容,甚至一点点。

你还搞砸了人为因素和接受财产,因为当你把我的地址

me+valid@mydomain.example.net

你告诉我我犯了一个错误,我跟你的申请说再见。

幸运的是,这个regex不是我的。)所以你也支持普通的emailfield方法?

我不会说Django,但这个论点适用于任何试图从语法上验证地址的行为。code.djangoproject.com/ticket/3344看起来甚至没有emailfield能胜任这项任务(但我看起来并不难)

该特定的票据被标记为自07/04/07以来已修复,并且在Unicode处理翻译的错误消息时出现了错误。我认为现在使用django验证器是相对安全的。

我可以看到很多答案都是基于Python的django框架。但为了验证电子邮件地址,为什么要安装这么重的软件。我们有针对python的validate_email包,用于检查电子邮件是否有效、格式是否正确以及是否真的存在。它是一个重量轻的包装(尺寸<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)

如果电子邮件存在于真实世界中,则返回"真",否则返回"假"。

此regex将以合理的准确性验证电子邮件地址。

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

它允许字母数字字符:_、.和-。

从此处更改代码:

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

对此:

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

和我一起工作很好。

Django的邮箱正则表达式是用于验证输入的邮箱地址是否符合规范。 在Django,邮箱的正则表达式被定义在email模块的`validators`。一般而言,邮箱的正则表达式遵循以下规则: 1. 邮箱的格式由用户名和域名组成,间用@符号连接。域名可以是IP地址或者主机名,例如"example@example.com"。 2. 用户名通常由字母、数字、下划线和特殊字符组成,长度可以是1到64个字符。 3. 域名由一个或多个标签组成,标签之间用`.`分隔。标签由字母、数字和连字符组成,长度可以是1到63个字符。例如"example.com"。 4. 不允许出现连续的`.`符号。 5. 域名后缀由字母和数字组成,长度可以是2到6个字符。例如".com"。 Django的邮箱正则表达式示例:`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}` 这个正则表达式的含义是:邮箱的用户名可以由大小写字母、数字、下划线、百分号、加号、减号和点号组成;域名可以由大小写字母、数字、连字符和点号组成;域名后缀可以由大小写字母组成,长度为2到6个字符。 在Django,可以使用正则表达式进行邮箱验证,以保证输入的邮箱地址符合规范,有效性。例如,在模型类的字段可以使用`validators`参数来设置邮箱验证规则,示例代码如下: ```python from django.db import models from django.core.validators import RegexValidator class MyModel(models.Model): email = models.EmailField(validators=[RegexValidator( regex=r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}', message='请输入有效的邮箱地址' )]) ``` 这样,在保存数据时,如果邮箱地址不符合规范,Django会抛出`ValidationError`异常,提示用户输入有效的邮箱地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值