2013-05-09 86 views
2

我正在使用電子郵件驗證使用具有RFC 2821的Java。 我用下面的代碼來驗證我的所有電子郵件地址:電子郵件驗證使用Java的RFC 2821

InternetAddress emailAddr = new InternetAddress(email); 
emailAddr.validate(); 

Java API的說,它的RFC-822標準。 RFC 2821和822之間有很大的區別嗎?

而且上述API失效驗證電子郵件以下情況:

  1. [email protected] - 驗證返回true,但它是無效的電子郵件
  2. var(comment)@yahoo.com - 驗證返回false,但它是有效的電子郵件

你能告訴我任何解決這個問題的方法嗎?

+1

你確定'ar @ yahoo'應該是無效的嗎?我會檢查一個通用的頂級域名是否可以用作主機名稱。 – Matteo 2013-05-09 07:41:27

+0

並且文檔中說:「驗證地址部分」,所以我猜'@'後面的所有內容都會被忽略。 – Matteo 2013-05-09 07:42:53

+0

在前面的問題中,Apache Commons被認爲是最好的工具(http://stackoverflow.com/questions/624581/what-is-the-best-java-email-address-validation-method),但我只是試了一下而已也未能接受評論。 – Matteo 2013-05-09 07:56:09

回答

1

現代電子郵件地址的處理方式與原始標準中的電子郵件地址之間存在很大差異。

從我設置dns &綁定地址你可以指定一個沒有句點的域名,但是當查詢解析器時,它會將.添加到域名的末尾。您還可以在主機文件中指定直接映射。大多數主機文件包含本地主機決心像這樣:

127.0.0.1本地主機環回

含義,如果你與你可以發送一個有效的E-mail給[email protected]郵件服務器的服務器上。

根據RFC 822

在正式註冊的情況下,一個組織實現 (分佈式)數據的基礎上,其爲以下形式的地址提供了一個地址到路由映射 服務:

  [email protected] 

請注意,「組織」是一個邏輯實體,與任何特定的通信網絡都是分開的。

訪問「組織」的機制是普遍可用的。
該機制反過來尋求註冊表的實例化;其地址說明中未指明其地址 。假設以「組織」 這個名稱運作的系統知道如何找到下級註冊表是 。然後,註冊管理機構將使用「人員」字符串確定向哪裏發送郵件 規範。

後者,面向網絡的情況下允許簡單的,直接的, 附件相關的地址指定,如:

    [email protected] 

[email protected]在本地系統的情況下,只要該電子郵件系統是正確配置您可以發送電子郵件至[email protected]。儘管這不是我們現在習慣的FQDN - Fully Qualified Domain Name,但是這個標準直到很晚纔出現。郵件系統然後使用別名將其發送到正確的本地網絡,將電子郵件翻譯爲[email protected]。電子郵件欺騙的問題直到後來ARPAnet公開時纔出現。

關於在地址的評論,這不是在RFC 822根據後來的電子郵件規範允許評論(RFC 2822 Section 3.4):

同時,由於某些傳統實現解釋評論, 評論一般不應該在地址字段中使用,以避免 混淆這樣的實現。

含義較舊的系統不允許在地址中留言。 RFC 822沒有在電子郵件地址中提到評論。

技術修復將是不允許在電子郵件地址的評論,除非你用自定義代碼包容他們。你可以隨時更新Javamail。 Newer implementations accommodate updated RFCs.

0

在我看來,你想驗證現在使用的電子郵件ID,而不是真正符合任何RFC。 對於我們的項目,我們製作了我們自己的非常簡單的電子郵件驗證器。爲什麼? apache和java郵件使用正則表達式,並且有一些情況(我不知道哪些是因爲我們不打印電子郵件的日誌),這使得正則表達式進入永久循環。這意味着客戶端處理程序線程進入循環並且用戶看到一個空白屏幕!

因此,我們所做的基本上是允許新的電子郵件ID,就像他們在像谷歌/雅虎這樣的網站看起來像。

含義[email protected]

我們檢查 最多1 @ 檢查1個或更多字符@前 後@什麼有一些字符+一個點ATLEAST點後+ CHRS

過去兩年沒有收到任何投訴。此外,大多數情況下,您需要向該人發送電子郵件以確保域名存在等,並使用唯一標記鏈接(註冊確認)以確保該人擁有該電子郵件標識(向真實所有者發送消息點擊,如果他們來到您的網站)

/** 
    * minimum email [email protected] 
    * */ 
    public static boolean checkEmail(final String emlId, int dbgPrint) { 
     // ex:[email protected] 
     if (emlId == null){ 
      return false; 
     } 
     final int lngth = emlId.length(); 
     if (lngth < 6) { 
      if (dbgPrint > 1) { 
       System.out.println(" lngth < 6"); 
      } 
      return false; 
     } 
     final int locationAt = emlId.indexOf('@'); 
     if (locationAt < 1) { 
      if (dbgPrint > 1) { 
       System.out.println("locationAt < 1 : " + locationAt); 
      } 
      return false;// 
     } 
     final int postLastPeriod = emlId.lastIndexOf('.'); 
     if (postLastPeriod < 0) { 
      if (dbgPrint > 1) { 
       System.out.println("postLastPeriod < 0, locationAt " + locationAt); 
      } 
      return false; 
     } 
     if (dbgPrint > 1) { 
      System.out.println(" locationAt " + locationAt + ", postLastPeriod :" + postLastPeriod + " lngth " + lngth); 
     } 
     if (lngth - postLastPeriod < 3) { 
      if (dbgPrint > 1) { 
       System.out.println(" lngth - postLastPeriod < 2"); 
      } 
      return false; 
     } 
     if (postLastPeriod - locationAt < 1) { 
      if (dbgPrint > 1) { 
       System.out.println(" postLastPeriod - locationAt < 1"); 
      } 
      return false; 
     } 
     return true; 

    }