반응형
<?
/*
=======================================================================
눈이오면의 메일 체크 함수 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
" 결과($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: <{$Email}><br>";
$From = fgets ( $Connect, 1024 ); //
서버의 응답코드를 받아옵니다.
//
서버에 수신자의 주소를 알려줍니다.
fputs ( $Connect, "RCPT TO: <{$Email}>\r\n"
);
if
($Debug) echo "실행 : RCPT TO: <{$Email}><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;
}
?>
반응형
'프로그래밍 > PHP' 카테고리의 다른 글
php 기본 자료 1 (0) | 2012.08.17 |
---|---|
php -xml parser (0) | 2012.08.17 |
php - 소켓 통신 자료(socket fd 에서 eof 인식문제) (0) | 2012.08.17 |
php - 변수관련 함수 (0) | 2012.08.17 |
php - SMARTY QUICKSTART GUIDE (Smarty 빠르게 시작하기) (0) | 2012.08.17 |