11
"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 扩展字符集在引号内有效?或者这是否仅意味着标准 ASCII 表

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

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");

该插件的内置验证似乎相当不错,除了捕获无效字符。在这里列出的测试用例中,它只不允许注释、折叠空格和缺少 TDL 的地址(即:@localhost、@255.255.255.255)——所有这些我都可以轻松地没有。

4

4 回答 4

4

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

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

重要的部分在这里:

Thomas Lee 是正确的,因为引用的本地部分在电子邮件地址中有效,并且某些邮件地址如果不在引用的字符串中则可能无效。但是,你们其他人提到的字符,例如元音变音和龙舌兰,不在 ASCII 字符集中,它们是扩展的 ASCII。在 RFC 2822(以及后续 RFC 的 5322 和 3696)中,dtext 规范(在引用的本地部分中允许)仅允许大多数 ASCII 值(RFC 2822,第 3.4.1 节),其中包括 33-90 和 94-126 范围内的值。已提议 RFC 5335 允许在 addr-spec 中使用非 ascii 字符,但它仍被标记为实验性的,因此 MailAddress 不支持。

于 2010-08-12T12:55:44.560 回答
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不是。

于 2010-08-12T13:01:16.670 回答
1

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

虽然上面对 Local-part 的定义相对宽松,但
为了最大程度的互操作性,希望接收邮件的主机应该避免定义 Local-part 需要(或使用)Quoted-string 形式或 Local-part 是大小写的邮箱- 敏感的。

...

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

于 2010-08-12T13:00:31.140 回答
0

HTML5 规范对有效电子邮件地址的问题有一个有趣的看法

有效的电子邮件地址是与 ABNF 产生式 1*( atext / "." ) "@" ldh-str 1*( "." ldh-str ) 匹配的字符串,其中 atext 在 RFC 5322 第 3.2.3 节中定义, 并且 ldh-str 在 RFC 1034 第 3.5 节中定义。

当然,这样做的好处是您可以查看开源浏览器的源代码来验证它(查找IsValidEmailAddress函数)。当然它是用 C 语言编写的,但翻译成 JS 并不难。

于 2010-08-12T14:32:44.587 回答