2010-08-12 58 views
10
"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) - 我可以轻松地在这些地方生活。

+0

一般来说,这类问题的最佳答案是地址是有效的,如果你可以让两个不同的MTA接受它。 IETF标准并不总是按照您的意愿明确地指定事物。 – msw 2010-08-12 12:57:14

+0

不要验证单个字符。 [确定语法](http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/1931322#1931322)。 – BalusC 2010-08-12 13:59:35

+0

@BafusC我* *验证语法。我也想阻止人们将梵文填入只有ASCII的字段中。这两者不是相互排斥的。不过,我确实认识到,使用RegEx进行真正的电子邮件验证就像一个redditer所说的那样,“就像建造一栋仅使用电钻的房屋一样。”客户端验证只是为了告诉某人“嘿,这不属于” - 我相信这是一个很好的,简单的方法。 – Greg 2010-08-12 14:03:37

回答

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 ,它允许在addr-spec中使用非ASCII字符 ,但它仍将 标记为实验,因此在MailAddress中不支持 。

1

技术上是可以的,但阅读:

虽然 本地部分上面的定义相对宽松,
最大的互操作性,这预计将收到的邮件主机 应该 避免定义 本地部分需要(或使用) 引用字符串表单或其中本地部分区分大小写的邮箱。

...

系统不得 定义邮箱的方式,要求在 SMTP的非ASCII字符使用。

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不是。

0

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

有效的E-mail地址是该ABNF生产相匹配的字符串1 *(atext/“”) “@” LDH-STR 1 *(“ 。“ldh-str)其中atext在RFC 5322第3.2.3节中定义,而ldh-str在RFC 1034第3.5节中定义。

关于这个的好处,当然是你可以再看看开源浏览器的source code for validating it(寻找IsValidEmailAddress功能)。当然,它是用C语言编写的,但不是很难翻译成JS。

相关问题