mun*_*ntu 69 python regex email django validation
我写了一个函数,用于添加电子邮件到新闻通讯库.直到我添加检查已发送电子邮件的有效性,它才能完美运行.现在,每次我收到"错误的电子邮件"作为回报.任何人都可以在这看到任何错误吗?使用的正则表达式是:
\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
Run Code Online (Sandbox Code Playgroud)
cji*_*cji 149
更新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')
Run Code Online (Sandbox Code Playgroud)
所以如果你不想使用表单和表单字段,你可以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
Run Code Online (Sandbox Code Playgroud)
这里是在PERL中使用的Mail :: RFC822 :: Address regexp,如果你真的需要那个偏执狂.
obl*_*lex 132
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")
Run Code Online (Sandbox Code Playgroud)
Nic*_*ght 49
不,请,请不要尝试自己验证电子邮件地址.这是人们永远无法做到的事情之一.
你最安全的选择,因为你已经在使用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.']
Run Code Online (Sandbox Code Playgroud)
你弄错了,但这是一项你不能做的任务.有一种方法可以知道RFC 2822地址是否有效,即向其发送邮件并获得响应.做其他任何事情都不能通过一小部分来改善数据的信息内容.
当你提供validateEmail我的地址时,你也会搞砸人为因素和接受财产
me+valid@mydomain.example.net
Run Code Online (Sandbox Code Playgroud)
你告诉我我犯了错误,告诉你应用程序再见.