server_side
php 네트웍프로그래밍 2
행복하자구요~
2007. 12. 29. 15:21
|
메일 전송 프로그래밍하기 PHP에서는 메일 전송을 아주 쉽게 구현할 수 있다. 실제로 사이트의 개발자들은 메일링이나 게시판을 응용한 애플리케이션을 만들 때 PHP가 제공하는 간단한 방법으로 메일 부분을 해결하기도 한다. 여기에서는 간단히 mail() 함수를 사용하여 메일을 보내는 예제와 mail() 함수를 사용하지 않고 SMTP를 이용한 예제를 만들어 보기로 한다. 먼저 mail() 함수를 사용하여 메일 보내는 루틴을 살펴보자.
<?
$to="sami@digitalonnet.com";
$company="디지탈온넷";
$from="root@sami.pe.kr";
$temp_from="from:";
$temp_from.="$company<$from>rn";
$title="제목";
$mailbody="내용";
$send_success=mail("$to", "$title", "$mailbody","$temp_from");
?>
메일 프로토콜에 대한 추가적인 설명은 생략하도록 하겠다. 메일 설정은 윈도우 2000 서버의 경우는 간단히 SMTP를 구성요소에서 설치하고 RELAY 및 허용을 로컬로 잡아주면 메일을 보낼 수 있다. 물론 리눅스에서도 기본적으로 메일을 보낼 수 있게 셋팅되어 있다. 메일 관련 애플리케이션은 결국 신뢰성이 생명이다. 메일이 잘 보내어졌는지를 확인하는 방법을 찾아내는 것이 더욱 중요하다고 할 수 있겠다. 앞의 코드에서 $send_success 변수를 체크해서(mail() 함수는 BOOL을 리턴함으로 TRUE가 아니면 에러를 체크하면 된다) 다시 보내는 루틴이나 메일 보내기 실패 루틴을 만들어야 한다. 이렇게 했을 때 메일 송신에 대한 신뢰가 나타날 수 있다. 물론 메일 수신에 대한 신뢰 또한 메일에 대한 애플리케이션에서 핵심적으로 떠오르는 기술이라고 할 수 있다. 먼저 SMTP를 통해서 직접 메일 보내기 예제를 살펴본 후 메일 수신에 관한 내용을 정리해 보겠다. 다음의 예제를 살펴보자.
<?
$subject = "제목";
$body="내용";
$body = htmlspecialchars($body);
$body = nl2br($body);
$subject = stripslashes($subject);
$body = stripslashes($body);
$fromname = "메일보내는사람";
$from = "보내는 메일주소";
$toname = "메일받는사람";
$to = "받는 메일주소";
$MailServer = "localhost";
// Port 25 Connection
$fp = fsockopen($MailServer, 25, &$errno, &$errstr, 30);
if(!$fp) { echo("sendmail 연결에러: $errstr ($errno)n"); exit; }
fgets($fp, 128);
fputs($fp, "helo <$HTTP_HOST>rn"); fgets($fp, 128);
fputs($fp, "mail from: <$from>rn");
$retval[0] = fgets($fp, 128);
fputs($fp, "rcpt to: <$to>rn");
$retval[1] = fgets($fp, 128);
fputs($fp, "datarn");
fgets($fp, 128);
fputs($fp, "Return-Path: <$from>rn");
fputs($fp, "From: "$fromname" <$from>rn");
fputs($fp, "To: <$to>rn");
fputs($fp, "Subject: $subjectrn");
fputs($fp, "X-Mailer: BR-netrn");
fputs($fp, "MIME-Version: 1.0rn");
fputs($fp, "Content-Type: text/html;rn");
fputs($fp, "charset="euc-kr"rn");
fputs($fp, "Content-Transfer-Encoding: base64rn");
fputs($fp, "rn");
$body = chunk_split(base64_encode($body));
fputs($fp, $body);
fputs($fp, "rn");
fputs($fp, "rn.rn");
$retval[2] = fgets($fp, 128);
fclose($fp);
// Send value Check!
if ( !ereg("^250", $retval[0]) || !ereg("^250", $retval[1]) || !ereg("^250", $retval[2]) )
echo("Mail Send Fail!");
else
echo("Mail Send Success!");
?>
이 소스는 리눅스에서 sendmail을 이용하여 25번 포트에 직접 접속하고 fsockopen() 함수를 이용하여 직접 메일을 쓰는 루틴이다. sendmail은 RELAY가 기본적으로 막혀 있어서 메일 보내기가 쉽지 않으나 서버 프로그램이 로컬 호스트에서 운영되기 때문에 메일을 보내는데 크게 문제가 되지 않을 것이다. 유심히 살펴볼 부분은 ‘rcpt to’가 있는 라인이다. 이것은 실제로 메일을 받는 사람의 주소를 적어주는 곳으로 만일 대용량 메일링 서비스를 하게 된다면 rcpt to가 포함된 fputs() 라인을 받을 회원들의 메일주소로 바꾸어 계속 추가해 주면 된다.
<?
for($i=0;$사용자 수;$i++)
{
fputs($fp, "rcpt to: <$to>rn");
}
?>
커뮤니티나 공개 소스 사이트에 가보면 크게 메일함수를 이용하는 방법과 직접 SMTP를 핸들링하는 방법의 2가지 테마로 프로그램들이 공개되어 있다. 실제 메일에 대한 자세한 내용은 sendmail 사이트나 SMTP 프로토콜 관련 서적을 참고하기 바란다.
앞에서 잠시 언급했던 이렇게 보낸 메일에 대한 수신 신뢰성은 어떻게 검증할 것인가를 이야기해 보자. 현재 웹 사이트의 개발 현황을 보면 CRM으로 방향을 잡고 있는 실정이다. 특히 E-CRM의 기초는 메일을 기초로 하고 있다. 솔루션 또한 메일 솔루션이 많다. 메일 솔루션은 수신자에 대한 호응이나 반응도를 가지고 회원의 정보를 갱신하고 이후 마케팅에 집중할 수 있게 도와 준다. 이렇게 했을 때 기초적인 기술이 바로 메일의 수신확인 여부일 것이다. 메일 수신확인은 보통 DB와 연동하여 스크립트를 숨기는 방법을 많이 사용한다. 간단한 고객 테이블을 가지고 설명해 보자. <표 1>과 같은 테이블의 형태로 고객의 메일에 대한 마케팅을 진행할 수 있다.
<표 1> 고객 테이블의 예제
◆ 메일을 보낸 결과는 위의 메일 보낸 결과를 체크함으로써 실제로 송신 가능한 메일인지, 아니면 서버오류로 실패인지를 판단할 수 있다.
◆ 수신 결과는 어떻게 할 수 있을까? 여러 가지 방법이 있지만 간단하게 몇 가지만 짚어보자. - 메일을 보낼 때 <HTML> 태그 속에 <IMG> 태그를 이용하는 방법이다. 예를 들면 HTML 문서를 보낼 때 이미지 태그를 다음과 같이 이용하는 것이다.
<IMG SRC='http://myhost/mailcheck.php?user_id=000‘ height='1' width='1'>
이렇게 하면 메일리더는 HTML을 파싱할 때 img를 실행시키기 때문에 실제 메일을 읽는 순간 http://myhost/mailcheck.php를 기동시킨다. 이 프로그램에서 user_id를 받아서 사용자가 메일을 읽었는지 판단할 수 있도록 DB를 업데이트하면 된다.
- 마찬가지로 <HTML> 태크 중에서 <FRAME>이나 <IFRAME>을 이용하는 방법이다. FRAME 태그는 화면구성을 여러 파일로 할 수 있기 때문에 링크를 서버쪽의 체크하는 루틴 페이지를 걸면 로드하면서 자연히 사용자가 메일을 읽었는지 판단할 수 있다.
◆ 메일을 읽고 있을 때 고객(메일 수신자)이 어떠한 이벤트를 진행했는지 알 수 있다. 이것은 메일의 형태에 따라서 다를 수도 있지만 개발자는 메일(HTML)의 특정한 이벤트를 서버로 보낼 수 있는 기능을 제공하여 행위를 저장할 수 있다. 이것은 사이트 방문의 DB필드와 비슷한 의미라고 할 수도 있겠다.
◆ 사이트 방문여부는 고객이 해당 메일을 클릭했을 때 처리할 수 있는 방법으로, 메일링의 고객 데이터를 수집하는 데 가장 큰 효과를 나타낸 결과라고 할 수 있다. 아이디나 메일주소를 로딩할 페이지에 걸어서 호출하면 고객이 접속을 시도했는지 판단할 수 있고, 이러한 정보는 반응 고객으로 분류하여 더욱 적극적인 메일 마케팅을 펼칠 수 있다.
◆ 메일을 읽고 있는 시간도 체크할 수 있다. 이것은 고객이 수신한 시간대를 말하는 것이 아니라 고객이 실제로 메일을 로딩하여 읽고 있었던 시간을 계산할 수도 있다. 이 방법은 좀 색다른 방법으로 고객이 얼마나 오래 메일을 체크하거나 읽고 있는지를 판단하여 마케팅에 활용할 수 있다는 점이다. 구현 방법은 여러 가지가 있겠지만 HTML이 언로드될 때나 로딩시부터 시작시간을 체크하기 시작하여 처리하는 방법도 하나의 예제가 될 수 있다.
이처럼 메일을 송신하는 기능은 아주 단순하나 이러한 기능을 가지고 얼마나 활용하느냐에 따라 하나의 훌륭한 솔루션을 만들 수 있다는 것을 기억하도록 하자.
|
| | |