检查电子邮件的有效性在Django / Python的

我写一个函数添加电子邮件通讯基地。 直到我添加了检查已发送的电子邮件的有效性它可以完美地运行。 现在,每一次,我的回报得到“错误的邮件”。 任何人都可以看到任何错误吗? 所使用的正则表达式是:

\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

--------------解决方案-------------

下面是部分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'|^"([01-10131416-37!#-\[\]-\177]|\\[01-011131416-\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 ::地址的正则表达式。

伊克,不,请不要试图验证电子邮件地址你自己。 它的那些东西的人从来没有得到正确的。

您最安全的选择,因为你已经在使用Django的,是只取它的形式验证电子邮件的优势。 每文档(http://docs.djangoproject.com/en/dev/ref/forms/fields/):

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

from django.core.exceptions import ValidationError
from django.core.validators import validate_email
try:
validate_email("[email protected]")
except ValidationError as e:
print "oops! wrong email"
else:
print "hooray! email is valid"

你理解错了,但它是一个任务,你不能反正做。 有且只有一个办法知道,如果一个RFC 2822的地址是有效的,那就是将邮件发送到它,并得到回应。 别人做任何事情不会提高你的数据由连分数比特的信息内容。

您还拧人的因素和接受性,当你给validateEmail我的地址

[email protected]

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

从这个改变你的代码:

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

为此:

re.match(R'\ B〔\ W .-] + @ [\ w .-] + \ W {2,4} \ B',电子邮件)

和我一起工作正常。

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

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

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

分类:蟒蛇 时间:2012-07-06 人气:3
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.414 (s). 10 q(s)