"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 :(得分: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。