这是有效的电子邮件地址吗?

时间:2010-08-12 12:48:01

标签: javascript jquery email rfc

"Françoise Lefèvre"@example.com

我正在阅读RFC 5321,试图真正理解什么是有效的电子邮件地址 - 而且我可能会让它变得比它需要的困难得多 - 但这一直困扰着我。

               i.e., within a quoted string, any
               ASCII graphic or space is permitted
               without blackslash-quoting except
               double-quote and the backslash itself.

这是否意味着ASCII extended character sets在引号内有效?或者这仅仅意味着standard ASCII table

编辑 - 考虑到答案,这里有一个简单的jQuery validator,可以补充插件的内置电子邮件验证来检查字符。

jQuery.validator.addMethod("ascii_email", function( value, element ) { 
    // In compliance with RFC 5321, this allows all standard printing ASCII characters in quoted text.
    // Unquoted text must be ASCII-US alphanumeric or one of the following: ! # $ % & ' * + - / = ? ^ _ ` { | } ~   
    // @ and . get a free pass, as this is meant to be used together with the email validator

    var result = this.optional(element) || 
        (
            /^[\u002a\u002b\u003d\u003f\u0040\u0020-\u0027\u002d-u002f\u0030-\u0039\u0041-\u005a\u005e-\u007e]+$/.test(value.replace(/(["])(?:\\\1|.)*?\1/, "")) &&     
            /^[\u0020-\u007e]+$/.test(value.match(/(["])(?:\\\1|.)*?\1/, ""))   
        );
    return result;
}, "Invalid characters");

插件的内置验证似乎非常好,除了捕获无效字符。在here列出的测试用例中,它只允许注释,折叠空格和缺少TDL的地址(即:@localhost,@ 255.255.255.255) - 所有这些都可以轻松地存在。

4 个答案:

答案 0 :(得分:4)

在此RFC中,ASCII表示US-ASCII,即不允许使用值大于127的字符。作为证据,这里有一些来自RFC 5321的引用:

  

邮件数据可能包含128个ASCII字符代码中的任何一个,[...]

     

[...]

     

系统不得以这样的方式定义邮箱:要求在SMTP中使用非ASCII字符(高位设置为1的八位字节)或ASCII“控制字符”(十进制值0-31和127) 。这些字符不得用于MAIL或RCPT命令或其他需要邮箱名称的命令。

这些引用非常清楚地表明值大于127的字符被视为non-ASCII。由于在MAIL TO或RCPT命令中明确禁止使用这些字符,因此无法将它们用于电子邮件地址。

因此,"Francoise Lefevre"@example.com是一个完全有效的地址(根据RFC),而"Françoise Lefèvre"@example.com则不是。

答案 1 :(得分:3)

根据此MSDN页面,扩展的ASCII字符目前无效,但有一个建议的规范可以改变这一点。

http://msdn.microsoft.com/en-us/library/system.net.mail.mailaddress(VS.90).aspx

重要的部分在这里:

  托马斯李的引用是正确的   本地部分在电子邮件中有效   地址和某些邮件地址可能   如果不在带引号的字符串中则无效。   但是,其他人的人物   你提到过诸如变音符号   并且龙舌兰不在ASCII中   字符集,它们被扩展   ASCII。在RFC 2822(以及随后的   RFC的5322和3696)dtext   规范(允许引用本地   部分)只允许大多数ASCII值   (RFC 2822,第3.4.1节)   包括范围从33-90的值   和94-126。已经提出了RFC 5335   这将允许非ascii字符   在addr-spec中,它仍然是   标记为实验,因此是   MailAddress不支持。

答案 2 :(得分:1)

技术上是,但请继续阅读:

  

虽然上面的定义为   本地部分是相对宽松的,
  为了实现最大的互操作性,主机   期待收到邮件应该是   避免定义邮箱所在的位置   本地部分需要(或使用)   引用字符串形式或其中   本地部分区分大小写。

...

  

系统绝不能定义邮箱   这种方式要求使用   非ASCII字符的SMTP。

答案 3 :(得分:0)

HTML5规范有一个interesting take on the issue of valid email addresses

  

有效的电子邮件地址是与ABNF生产1 *(atext /“。”)“@”ldh-str 1 *(“。”ldh-str)相匹配的字符串,其中文本在RFC 5322部分中定义3.2.3和ldh-str在RFC 1034第3.5节中定义。

当然,关于这一点的好处是,您可以查看开源浏览器的source code for validating it(查找IsValidEmailAddress函数)。当然它是在C语言中,但并不太难以翻译成JS。