3

我对 django EmailField 有同样的小问题。

forms.EmailField(required=True, label="E-mail", widget=forms.TextInput(attrs=

它不接受表单中的电子邮件

xx.@xxxxxxx.xxx

它会返回格式不正确的错误消息,但电子邮件正常工作(电子邮件已有 15 年历史)。我认为 at-sign 之前的点是问题所在。

它是一个错误吗?是否有任何解决方案使其适用于此类电子邮件?

多谢 :)

4

3 回答 3

2

EmailField是一个CharField检查该值是否是有效的电子邮件地址的。它使用EmailValidator来验证输入。

EmailValidator课程按此行拆分您的电子邮件:

user_part, domain_part = value.rsplit('@', 1) 

因此user_part是之前的部分@。并EmailValidator通过这个正则表达式检查它的验证:

user_regex = 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
    re.IGNORECASE)

\.正如你所看到的,在之前不可能 @,有一个\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+它之后!所以没有机会\.!!!

于 2014-11-20T09:54:05.267 回答
2

RFC 5321的第 4.2.1 节中,地址的“本地部分”具有以下语法:

Local-part     = Dot-string / Quoted-string
                 ; MAY be case-sensitive


Dot-string     = Atom *("."  Atom)

Atom           = 1*atext

我对此的解释是,Atom 必须至少有一个字符,而 Dot-string 是一个或多个 Atom,它们之间带有点,Local-part 是 Dot-string 或 Quoted-string。

如果我解释正确,那么一个原子必须始终跟在一个点之后,您的电子邮件地址正式无效,例如连续两个点也是无效的。

尽管像 GMail 这样的服务器选择只过滤掉本地部分的所有点并接受这些地址,但这并不能使它们正式有效。

引用本地部分 ( "xx."@xxxx.xxx) 应该可以,但您也可以编写自定义验证器和您自己的 EmailField 子类。

于 2014-11-20T09:48:21.433 回答
0

正如其他人所说,也许这不是一个有效的电子邮件地址。但作为一种解决方法,你可以做这样的事情。我没有把正则表达式放进去,但希望你明白:

from django.core.validators import EmailValidator
from django.db import models

class MyEmailValidator(EmailValidator):
    user_regex = re.compile('ALTERED REGULAR EXPRESSION')

class MyModel(models.Model):
    forms.EmailField(required=True, label="E-mail", validators=[MyEmailValidator()])

您可以查看 django.core.validators.EmailValidator 以获得有关如何制作正则表达式的想法。

于 2014-11-20T09:55:32.173 回答