2010-08-12 138 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。

相關問題