SMPT 로 메일 보내는 클래스 class.Smtp.php > XHOST BBS 관련자료

본문 바로가기

검색취소

SMPT 로 메일 보내는 클래스 class.Smtp.php

검색 이전 다음 목록

첨부파일

본문

하근호님이 만든 class.Smtp.php 를 최근 PHP 환경에서 동작될수 있게 수정하였습니다.

관련 클래스와 예제를 첨부합니다.

 

 

 

 

 

 

예제)

include "class.Smtp.php";

$mail = new Smtp("self");
$mail->debug();
$mail->send("김성대 <xhost2001@paran.com>","관리자 <webmaster@hanja114.org>","이 메일은 정상입니다.", "정상적인 메일이니 삭제하지 마십시오.");

 

 

<?

/***************************************/
/* 파일명 : class.Smtp.php
/* 제작일 : 2002-08-30
/* 제작자 : 하근호(hopegiver@korea.com)
/***************************************/

class Smtp {

 var $host;
 var $fp;
 var $self;
 var $lastmsg;
 var $parts;
 var $error;
 var $debug;
 var $charset;
 var $ctype;

 function Smtp($host="localhost") {
  if($host == "self") $this->self = true;
  else $this->host = $host;
  $this->parts = array();
  $this->error = array();
  $$this->debug = 0;
  $this->charset = "euc-kr";
  $this->ctype = "text/html";
 }

 // 디버그 모드 : 1
 function debug($n=1) {
  $this->debug = $n;
 }

 // smtp 통신을 한다.
 function dialogue($code, $cmd) {
  fputs($this->fp, $cmd."\r\n");
  $line = fgets($this->fp, 1024);
  ereg("^([0-9]+).(.*)$", $line, &$data);
  $this->lastmsg = $data[0];

  if($this->debug) {
   echo htmlspecialchars($cmd)."<br>".$this->lastmsg."<br>";
   flush();
  }

  if($data[1] != $code) return false;
  return true;

 }

 //  smptp 서버에 접속을 한다.
 function smtp_connect($host) {
  if($this->debug) {
   echo "SMTP($host) Connecting...<br>";
   flush();
  }
  if(!$host) $host = $this->host;
  if(!$this->fp = fsockopen($host, 25, $errno, $errstr, 10)) {
   $this->lastmsg = "SMTP($host) 서버접속에 실패했습니다.[$errno:$errstr]";
   return false;
  }
  $line = fgets($this->fp, 1024);
  ereg("^([0-9]+).(.*)$", $line, &$data);
  $this->lastmsg = $data[0];
  if($data[1] != "220") return false;
  if($this->debug) {
   echo $this->lastmsg."<br>";
   flush();
  }
  $this->dialogue(250, "HELO phpmail");
  return true;
 }

 // stmp 서버와의 접속을 끊는다.
 function smtp_close() {
  $this->dialogue(221, "QUIT");
  fclose($this->fp);
  return true;
 }

 // 메시지를 보낸다.
 function smtp_send($email, $from, $data) {
  if(!$mail_from = $this->get_email($from)) return false;
  if(!$rcpt_to = $this->get_email($email)) return false;
  if(!$this->dialogue(250, "MAIL FROM: $mail_from"))
   $this->error[] = $email.":MAIL FROM 실패($this->lastmsg)";
  if(!$this->dialogue(250, "RCPT TO: $rcpt_to"))
   $this->error[] = $email.":RCPT TO 실패($this->lastmsg)";
  $this->dialogue(354, "DATA");
  $mime = "Message-ID: <".$this->get_message_id().">\r\n";
  $mime .= "From: $from\r\n";
  $mime .= "To: $email\r\n";
  fputs($this->fp, $mime);
  fputs($this->fp, $data);
  $this->dialogue(250, ".");
 }

 // Message ID 를 얻는다.
 function get_message_id() {
  $id = date("YmdHis",time());
  mt_srand((float) microtime() * 1000000);
  $randval = mt_rand();
  $id .= $randval."@phpmail";
  return $id;
 }

 // Boundary 값을 얻는다.
 function get_boundary() {
  $uniqchr = uniqid(time());
  $one = strtoupper($uniqchr[0]);
  $two = strtoupper(substr($uniqchr,0,8));
  $three = strtoupper(substr(strrev($uniqchr),0,8));
  return "----=_NextPart_000_000${one}_${two}.${three}";
 }

 // 첨부파일이 있을 경우 이 함수를 이용해 파일을 첨부한다.
 function attach($message, $name="", $ctype="application/octet-stream") {
  $this->parts[] = array ("ctype" => $ctype, "message" => $message, "name" => $name);
 }

 // Multipart 메시지를 생성시킨다.
 function build_message($part) {
  $msg .= "Content-Type: ".$part['ctype'];
  if($part['name']) $msg .= "; name=\"".$part['name']."\"";
  $msg .= "\r\nContent-Transfer-Encoding: base64\r\n";
  $msg .= "Content-Disposition: attachment; filename=\"".$part['name']."\"\r\n\r\n";
  $msg .= chunk_split(base64_encode($part['message']));
  return $msg;
 }

 // SMTP에 보낼 DATA를 생성시킨다.
 function build_data($subject, $body) {
  $boundary = $this->get_boundary();
  $mime .= "Subject: $subject\r\n";
  $mime .= "Date: ".date ("D, j M Y H:i:s T",time())."\r\n";
  $mime .= "MIME-Version: 1.0\r\n";
  $mime .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n\r\n".
     "This is a multi-part message in MIME format.\r\n\r\n";
  $mime .= "--".$boundary."\r\n".
    "Content-Type: ".$this->ctype."; charset=\"".$this->charset."\"\r\n".
    "Content-Transfer-Encoding: base64\r\n\r\n".
    chunk_split(base64_encode($body)).
    "\r\n\r\n--".$boundary;
  $max = count($this->parts);
  for($i=0; $i<$max; $i++) {
   $mime .= "\r\n".$this->build_message($this->parts[$i])."\r\n\r\n--".$boundary;
  }
  $mime .= "--\r\n";
  return $mime;
 }

 // MX 값을 찾는다.
 function get_mx_server($email) {
  if(!ereg("([\._0-9a-zA-Z-]+)@([0-9a-zA-Z-]+\.[a-zA-Z\.]+)", $email, $reg)) return false;
  getmxrr($reg[2], $host);
  if(!$host) $host[0] = $reg[2];
  return $host;
 }

 // 이메일의 형식이 맞는지 체크한다.
 function get_email($email) {
  if(!ereg("([\._0-9a-zA-Z-]+)@([0-9a-zA-Z-]+\.[a-zA-Z\.]+)", $email, $reg)) return false;
  return "<".$reg[0].">";
 }

 // 메일을 전송한다.
 function send($to, $from, $subject, $body) {
  if(!is_array($to)) $to = split("[,;]",$to);
  if($this->self) {
   $data = $this->build_data($subject, $body);
   foreach($to as $email) {
    if($host = $this->get_mx_server($email)) {
     $flag = false; $i = 0;
     while($flag == false) {
      if($host[$i]) {
       $flag = $this->smtp_connect($host[$i]);
       $i++;
      } else break;
     }
     if($flag) {
      $this->smtp_send($email, $from, $data);
      $this->smtp_close();
     } else {
      $this->error[] = $email.":SMTP 접속실패";
     }
    } else {
     $this->error[] = $email.":형식이 잘못됨";
    }
   }
  } else {
   if(!$this->smtp_connect($this->host)) {
    $this->error[] = "$this->host SMTP 접속실패";
    return false;
   }
   $data = $this->build_data($subject, $body);
   foreach($to as $email) $this->smtp_send($email, $from, $data);
   $this->smtp_close();
  }
 }
}
?>

등록된 댓글이 없습니다.

검색취소

XHOST BBS 관련자료

검색
  • no image
  • XHOST 관련 화면 자료입니다.

    댓글1

    XHOST 에 대한 이해를 돕기 위해 현재 운영중인 XHOST BBS 로 동작되는  BBS 의 화면 캡춰를 등록합니다. 소개는 오래전에 등록된 소개로 대치합니다.^^ XHOST bbs 리눅스는 자체만으로 매력이 많은…

  • no image
  • [소스공개] XHOST 5.22d 버젼입니다.

    첨부파일

    XHOST BBS 호스트의 전체 소스입니다. (화면,데이타등등 포함) 소스설명,구조,활용법,컴파일방법등에 관한 질문은 받지 않으니 양지바랍니다. 상업적으로 사용하실때는 반드시 개발자의 승인을 받아야 합니다. 소스를 …

  • no image
  • XHOST6.0BB Mysql DB 버젼 소스 입니다.

    첨부파일

    공개된 버젼중에는 제일 마지막 버젼입니다. XHOST의 DB 버젼이면서 동시에 WEB bbs 연동버젼입니다. 상당히 많은곳에서 사용하고 있고, 텔넷 BBS의 거의 모든기술이 포함된 버젼입니다. 그래서 공개하기가 참 …

?>