2013-05-09 5 views
2

RFC 2821을 염두에두고 java를 사용하여 전자 메일 유효성 검사를하고 있습니다. 내 모든 이메일 주소의 유효성을 검사하기 위해 다음과 같은 코드를 사용했습니다 :전자 메일 유효성 검사 Java를 사용하는 RFC 2821

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

자바 API는 RFC-822을 준수라고합니다. RFC 2821과 822 사이에 많은 차이점이 있습니까? 유효성 검사가 true를 반환하지만 잘못된 이메일

  • var(comment)@yahoo.com입니다 - -

    1. [email protected] 검증 false를 반환하지만, 유효한 이메일
    2. 입니다 :

      또한 위의 API는 아래의 경우에 이메일을 검증하기 위해 실패

    이 문제를 해결하려면 해결 방법을 알려주실 수 있습니까?

  • +1

    'ar @ yahoo'이 (가) 틀렸습니까? 일반 최상위 도메인을 호스트 이름으로 사용할 수 있는지 확인합니다. – Matteo

    +0

    그리고 설명서에 "주소 부분 유효성 검사"라고 쓰여 있으므로'@ '다음의 모든 내용은 무시됩니다. – Matteo

    +0

    이전 질문에서 Apache Commons가 가장 좋은 도구로 제안되었지만 (http://stackoverflow.com/questions/624581/what-is-the-best-java-email-address-validation-method) 방금 시도했는데 또한 의견을 수락하지 못합니다. – Matteo

    답변

    1

    현대 전자 메일 주소를 처리하는 방식과 원래 표준의 전자 메일 주소를 처리하는 방식에는 크게 다릅니다. 난 당신이 기간없이 도메인 이름을 지정할 수 있지만 해결이 조회 될 때 도메인 이름의 끝에 .을 추가 할 것입니다 DNS에게 & 바인드 주소를 설정 경험 한 일에서

    . 호스트 파일에서 스트레이트 매핑을 지정할 수도 있습니다. 당신은 당신이 [email protected]에 유효한 전자 메일을 보낼 수있는 메일 서버와 서버에 있다면

    127.0.0.1 localhost를 루프백

    의미 : 대부분의 호스트 파일은 다음과 같이 해결 로컬 호스트를 포함합니다. RFC 822에 따르면

    : 정식 등록의 경우

    이 조직은 형태의 주소를 주소 - 투 - 경로 매핑 서비스를 제공하는 (분산) 데이터베이스를 구현합니다

      [email protected] 
    

    "조직"은 특정 통신 네트워크 인 과는 별도로 논리적 개체입니다.

    "조직"에 액세스하는 메커니즘이 보편적으로 사용 가능합니다.
    그런 메커니즘은 레지스트리의 인스턴스화를 찾습니다. 그 위치는 주소 지정에 표시되지 않습니다. 이라는 이름으로 운영되는 시스템은 하위 조직을 찾는 방법을 알고 있다고 가정합니다. 조직 이름은 입니다. 레지스트리는 "사람"문자열을 사용하여 메일을 보낼 위치를 결정합니다. .

    후자 네트워크 지향적 케이스 같은 간단한 직접 첨부 관련 주소 지정, 허가 : 로컬 시스템 [email protected]의 경우

        [email protected] 
    

    을 한 전자 메일 시스템 인 것처럼 제대로 설정하면 [email protected]으로 이메일을 보낼 수 있습니다. 비록 이것이 지금까지 익숙했던 FQDN - Fully Qualified Domain Name이 아니지만, 그 표준은 훨씬 늦게까지 올 수 없었습니다. 그런 다음 메일 시스템은 별칭을 사용하여 이메일을 [email protected]으로 번역하는 정확한 로컬 네트워크로 전송합니다. 이메일 스푸핑 문제는 나중에 ARPAnet이 공개 될 때까지 오지 않았습니다. 일반적으로 일부 레거시 구현 해석하기 때문에 주석, 의견,

    또한 : 주소의 주석에 대해

    , 그 의견 수있는 나중에 이메일 사양 ( RFC 2822 Section 3.4)에 따르면 RFC 822에 없었다 같은 구현을 혼동하지 않도록 주소 필드에 사용해서는 안됩니다.

    의미가 오래된 시스템은 주소에 주석을 허용하지 않습니다. RFC 822는 전자 메일 주소로 의견을 언급하지 않습니다.

    사용자 지정 코드를 사용하지 않는 한 전자 메일 주소에 주석을 허용하지 않는 것이 기술적 인 문제입니다. 항상 Javamail을 업데이트 할 수 있습니다. Newer implementations accommodate updated RFCs.

    0

    요즘 사용되는 전자 메일 ID를 확인하고 모든 RFC를 준수하지 않기를 바랍니다. 프로젝트를 위해 우리는 아주 간단한 이메일 검증 도구를 만들었습니다. 왜 ? 아파치와 자바 메일 하나는 정규식을 사용하고 정규 표현식을 영원히 반복 할 수있는 몇 가지 경우가 있습니다. 즉, 클라이언트 처리기 스레드가 루프로 들어가고 사용자에게 빈 화면이 표시됩니다!

    그래서 우리는 기본적으로 google/yahoo와 같은 사이트에서와 같이 새로운 이메일 ID를 허용합니다. [email protected]에게 의미

    일부 문자 + 하나 개의 점을 우리가 @ 후에 @ 전에 1 개 이상의 문자에 대한 확인 @ 에서 대부분의 일을 확인이어야 점 후 + CHRS

    지난 2 년간 아무런 불만이 없었습니다. 또한 도메인을 확인하기 위해 전자 메일을 보내야 할 때 대부분의 경우와 고유 한 토큰 (등록 확인)을 통해 사용자가 전자 메일 ID를 소유하고 있는지 확인해야합니다 (진짜 소유자에게만 메시지를 보낼 수 있음). 그들이 귀하의 사이트를 방문한 경우 클릭하십시오.)

    /** 
        * 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; 
    
        }