이메일이 실재 존재하는지 체크

페이지 정보

profile_image
작성자 LJM
댓글 0건 조회 47회 작성일 17-11-09 08:36

본문

/* ===============

   

눈이오면의 메일 체크 함수 SnowCheckMail ($Email,$Debug=false) 

 

$Email : 체크하기 위한 메일 주소 

$Debug : 디버깅을 위한 변수, true로 하면 각 과정의 진행상황이 출력된다. 

 

* 함수명을 바꾸시지 않고 사용하시면 누구나 사용하실수 있습니다. 

 

참고 : O'REILLY - Internet Email Programming 

 

=============== */ 

 

function SnowCheckMail($Email,$Debug=false) 

    global $HTTP_HOST; 

    $Return =array(); 

    // 반환용 변수 

    // $Return[0] : [true|false] - 처리결과의 true,false 값을 저장. 

    // $Return[1] : 처리결과에 대한 메세지 저장. 

 

    // Email 형식 체크를 위한 정규식 표현. 많이 공개된 것이니 설명을 하지않도록 하겠습니다. 

    if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $Email)) { 

        $Return[0]=false; 

        $Return[1]="${Email}은(는) 올바르지않은 메일 형식입니다."; 

        if ($Debug) echo "에러 : {$Email}은 올바르지 않은 메일 형식입니다.
";         

        return $Return; 

    } 

    else if ($Debug) echo "확인 : {$Email}은 올바른 메일 형식입니다.
"; 

 

    // 메일은 @를 기준으로 2개로 나눠줍니다. 만약에 $Email 이 "lsm@ebeecomm.com"이라면 

    // $Username : lsm 

    // $Domain : ebeecomm.com 이 저장 

    // list 함수 레퍼런스 : http://www.php.net/manual/en/function.list.php 

    // split 함수 레퍼런스 : http://www.php.net/manual/en/function.split.php 

    list ( $Username, $Domain ) = split ("@",$Email); 

 

    // 도메인에 MX(mail exchanger) 레코드가 존재하는지를 체크. 근데 영어가 맞나 모르겠네여 -_-+ 

    // checkdnsrr 함수 레퍼런스 : http://www.php.net/manual/en/function.checkdnsrr.php 

    if ( checkdnsrr ( $Domain, "MX" ) )  { 

        if($Debug) echo "확인 : {$Domain}에 대한 MX 레코드가 존재합니다.
"; 

        // 만약에 MX 레코드가 존재한다면 MX 레코드 주소를 구해옵니다. 

        // getmxrr 함수 레퍼런스 : http://www.php.net/manual/en/function.getmxrr.php 

        if ( getmxrr ($Domain, $MXHost))  { 

      if($Debug) { 

                echo "확인 : MX LOOKUP으로 주소 확인중입니다.
"; 

              for ( $i = 0,$j = 1; $i < count ( $MXHost ); $i++,$j++ ) { 

            echo "        결과($j) - $MXHost[$i]
"; 

        } 

            } 

        } 

        // getmxrr 함수는 $Domain에 대한 MX 레코드 주소를 $MXHost에 배열형태로 저장시킵니다. 

        // $ConnectAddress는 소켓접속을 하기위한 주소입니다. 

        $ConnectAddress = $MXHost[0]; 

    } 

    else { 

        // MX 레코드가 없다면 그냥 @ 다음의 주소로 소켓접속을 합니다. 

        $ConnectAddress = $Domain;         

        if ($Debug) echo "확인 : {$Domain}에 대한 MX 레코드가 존재하지 않습니다.
"; 

    } 

 

    // $ConnectAddress에 메일 포트인 25번으로 소켓 접속을 합니다. 

    // fsockopen 함수 레퍼런스 : http://www.php.net/manual/en/function.fsockopen.php 

    $Connect = fsockopen ( $ConnectAddress, 25 ); 

 

    // 소켓 접속에 성공 

    if ($Connect)   

    { 

        if ($Debug) echo "{$ConnectAddress}의 SMTP에 접속 성공했습니다.
"; 

        // 접속후 문자열을 얻어와 220으로 시작해야 서비스가 준비중인 것이라 판단. 

        // 220이 나올때까지 대기 처리를 하면 더 좋겠지요 ^^; 

        // fgets 함수 레퍼런스 : http://www.php.net/manual/en/function.fgets.php 

        if ( ereg ( "^220", $Out = fgets ( $Connect, 1024 ) ) ) { 

             

            // 접속한 서버에게 클라이언트의 도착을 알립니다. 

            fputs ( $Connect, "HELO $HTTP_HOST\r\n" ); 

                if ($Debug) echo "실행 : HELO $HTTP_HOST
"; 

            $Out = fgets ( $Connect, 1024 ); // 서버의 응답코드를 받아옵니다. 

 

            // 서버에 송신자의 주소를 알려줍니다. 

            fputs ( $Connect, "MAIL FROM: <{$Email}>\r\n" ); 

                if ($Debug) echo "실행 : MAIL FROM: <{$Email}>
"; 

            $From = fgets ( $Connect, 1024 ); // 서버의 응답코드를 받아옵니다. 

 

            // 서버에 수신자의 주소를 알려줍니다. 

            fputs ( $Connect, "RCPT TO: <{$Email}>\r\n" ); 

                if ($Debug) echo "실행 : RCPT TO: <{$Email}>
"; 

            $To = fgets ( $Connect, 1024 ); // 서버의 응답코드를 받아옵니다. 

 

            // 세션을 끝내고 접속을 끝냅니다. 

            fputs ( $Connect, "QUIT\r\n"); 

                if ($Debug) echo "실행 : QUIT
"; 

 

            fclose($Connect); 

 

                // MAIL과 TO 명령에 대한 서버의 응답코드가 답긴 문자열을 체크합니다. 

                // 명령어가 성공적으로 수행되지 않았다면 몬가 문제가 있는 것이겠지요. 

                // 수신자의 주소에 대해서 서버는 자신의 메일 계정에 우편함이 있는지를 

                // 체크해 없다면 550 코드로 반응을 합니다. 

                if ( !ereg ( "^250", $From ) || !ereg ( "^250", $To )) { 

                    $Return[0]=false; 

                    $Return[1]="${Email}은(는) 메일서버에서 허가되지 않은 주소입니다."; 

                    if ($Debug) echo "{$ConnectAddress}에서 허가하지 않는 메일주소입니다.
"; 

                    return $Return; 

                } 

        } 

    } 

    // 소켓 접속에 실패 

    else { 

        $Return[0]=false; 

        $Return[1]="메일서버({$ConnectAddress})에 접속할 수 없습니다."; 

        if ($Debug) echo "{$ConnectAddress}의 SMTP에 접속 실패했습니다.
"; 

        return $Return; 

    } 

    // 오~ 위를 모두 통과한 메일에 대해서는 맞는 메일이라고 생각하고 눈 딱 감아주져.^^; 

    $Return[0]=true; 

    $Return[1]="{$Email}은(는) 아무런 문제가 없는 메일주소입니다."; 

    return $Return; 

 

 

echo SnowCheckMail('체크이메일', true);


댓글목록

등록된 댓글이 없습니다.

로그인