我已经写了一个将邮箱添加到时事通讯基础的函数.直到我添加了判断已发送邮箱的有效性,它才能完美地工作.现在每次我都会收到"错误的邮箱"作为回报.有人能看到这里有什么错误吗?使用的正则表达式为:

\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b并且http://gskinner.com/RegExr/%有效(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

推荐答案

UPDATE 2017:下面的代码是7年前的,后来进行了修改、修复和扩展.对于任何现在希望这样做的人来说,正确的代码大约在here左右.

这是django的一部分.果心您可能会发现有趣的验证器:)

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

这里是Perl中使用的Mail::RFC822::Address regexp个代码,如果您真的需要这样偏执的话.

Django相关问答推荐

如何根据属性的 Select 对查询集进行排序

管理器不能通过对象上的对象实例访问.保存()

Django Rest Framework 认证类覆盖 request.user

Django:获取每组最新的N条记录

为什么 django 不能相互识别 2 个路径转换器?

在用例图中建模前端和后端

Django 模板中的 Handlebars.js

将计数字段添加到 django rest 框架序列化程序

Django中基于令牌的身份验证

是否可以在没有模型的情况下创建自定义管理视图

Django JSONField 过滤

如何测试某个日志(log)消息是否记录在 Django 测试用例中?

在 django 中获取本地时区

django python 日期时间设置为午夜

在 Celery 任务中运行 Scrapy 蜘蛛

如何将 settings.py 中的变量传递给视图?

django-getlist()

Django:如何从模板中识别调用视图?

Django - 指定 Django 管理员应该使用哪个模型管理器

如何从 django 请求中获取完整的 url