본문 바로가기

프로그래밍/PHP

php - 이메일 존재여부 검색 프로그램

반응형
<?
/* =======================================================================
  
눈이오면의 메일 체크 함수 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}은 올바르지 않은 메일 형식입니다.<br>";        
        return
$Return;
    }
    else if (
$Debug) echo "확인 : {$Email}은 올바른 메일 형식입니다.<br>";

    
// 메일은 @를 기준으로 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 레코드가 존재합니다.<br>";
        
// 만약에 MX 레코드가 존재한다면 MX 레코드 주소를 구해옵니다.
        // getmxrr 함수 레퍼런스 : http://www.php.net/manual/en/function.getmxrr.php
        
if ( getmxrr ($Domain, $MXHost))  {
      if(
$Debug) {
                echo
"확인 : MX LOOKUP으로 주소 확인중입니다.<br>";
              for (
$i = 0,$j = 1; $i < count ( $MXHost ); $i++,$j++ ) {
            echo
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;결과($j) - $MXHost[$i]<BR>";
        }
            }
        }
        
// getmxrr 함수는 $Domain에 대한 MX 레코드 주소를 $MXHost에 배열형태로 저장시킵니다.
        // $ConnectAddress는 소켓접속을 하기위한 주소입니다.
        
$ConnectAddress = $MXHost[0];
    }
    else {
        
// MX 레코드가 없다면 그냥 @ 다음의 주소로 소켓접속을 합니다.
        
$ConnectAddress = $Domain;        
        if (
$Debug) echo "확인 : {$Domain}에 대한 MX 레코드가 존재하지 않습니다.<br>";
    }

    
// $ConnectAddress에 메일 포트인 25번으로 소켓 접속을 합니다.
    // fsockopen 함수 레퍼런스 : http://www.php.net/manual/en/function.fsockopen.php
    
$Connect = fsockopen ( $ConnectAddress, 25 );

    
// 소켓 접속에 성공
    
if ($Connect)  
    {
        if (
$Debug) echo "{$ConnectAddress}의 SMTP에 접속 성공했습니다.<br>";
        
// 접속후 문자열을 얻어와 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<br>";
            
$Out = fgets ( $Connect, 1024 ); // 서버의 응답코드를 받아옵니다.

            // 서버에 송신자의 주소를 알려줍니다.
            
fputs ( $Connect, "MAIL FROM: <{$Email}>\r\n" );
                if (
$Debug) echo "실행 : MAIL FROM: &lt;{$Email}&gt;<br>";
            
$From = fgets ( $Connect, 1024 ); // 서버의 응답코드를 받아옵니다.

            // 서버에 수신자의 주소를 알려줍니다.
            
fputs ( $Connect, "RCPT TO: <{$Email}>\r\n" );
                if (
$Debug) echo "실행 : RCPT TO: &lt;{$Email}&gt;<br>";
            
$To = fgets ( $Connect, 1024 ); // 서버의 응답코드를 받아옵니다.

            // 세션을 끝내고 접속을 끝냅니다.
            
fputs ( $Connect, "QUIT\r\n");
                if (
$Debug) echo "실행 : QUIT<br>";

            
fclose($Connect);

                
// MAIL과 TO 명령에 대한 서버의 응답코드가 답긴 문자열을 체크합니다.
                // 명령어가 성공적으로 수행되지 않았다면 몬가 문제가 있는 것이겠지요.
                // 수신자의 주소에 대해서 서버는 자신의 메일 계정에 우편함이 있는지를
                // 체크해 없다면 550 코드로 반응을 합니다.
                
if ( !ereg ( "^250", $From ) || !ereg ( "^250", $To )) {
                    
$Return[0]=false;
                    
$Return[1]="${Email}은(는) 메일서버에서 허가되지 않은 주소입니다.";
                    if (
$Debug) echo "{$ConnectAddress}에서 허가하지 않는 메일주소입니다.<br>";
                    return
$Return;
                }
        }
    }
    
// 소켓 접속에 실패
    
else {
        
$Return[0]=false;
        
$Return[1]="메일서버({$ConnectAddress})에 접속할 수 없습니다.";
        if (
$Debug) echo "{$ConnectAddress}의 SMTP에 접속 실패했습니다.<br>";
        return
$Return;
    }
    
// 오~ 위를 모두 통과한 메일에 대해서는 맞는 메일이라고 생각하고 눈 딱 감아주져.^^;
    
$Return[0]=true;
    
$Return[1]="{$Email}은(는) 아무런 문제가 없는 메일주소입니다.";
    return
$Return;
}
?>
반응형