/*
¸ÞÀÏ º¸³»±âÀ§ÇÑ Å¬·¡½º
*/
// Class Description : mailing through smtp socket
// Original Source : hopegiver@korea.com
//
// Using method --
//
// $mail = new smtp("self"); //ÀÚü¹ß¼ÛÀÏ °æ¿ì, ¼¹ö¸¦ ÁöÁ¤ÇÒ¼öµµ ÀÖÀ½.
// $mail->debug(); //µð¹ö±ëÇÒ¶§
// $mail->attach("ÆÄÀϹöÆÛ", "ÆÄÀÏÀ̸§", "ÆÄÀÏŸÀÔ");
// $mail->send("receiver@mail", "sender@mail", "subject", "contents");->¿øº»
// $mail->send("receiver@mail", "sender@mail", "subject", "contents", $text_html="y");->¼öÁ¤º»
// ´ÙÀ½,ÇÖ¸ÞÀÏ,³×¶ì¾Ó,µå¸²À§Áî,ÄÚ¸®¾Æ´åÄÄ,Çѹ̸£,¿¥ÆÈ,ÀÎÆ¼Áðµî À¥¸ÞÀÏ Å×½ºÆ® ¼º°øÈ®ÀÎ.
// ¼¹öÀÇ È£½ºÆ® ³×ÀÓ°ú IP°¡ DNS LOOKUP ÇßÀ»¶§ ³ª¿À´Â ¾ÆÀÌÇÇ¿Í °°¾Æ¾ß À¥¸ÞÀÏ ¼¹ö¿¡¼ ¹Þ¾ÆµéÀÓ.
// ¿¹¸¦ µé¾î ·ÎÄÃÈ£½ºÆ® (µµ¸ÞÀÎ ¾ø´Â°÷ ¿¡¼´Â À¥¸ÞÀÏ¿¡¼ °ÅºÎÇÔ)
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 = "utf-8";
$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);
preg_match("/^([0-9]+).(.*)$/", $line, $data);
$this->lastmsg = $data[0];
if($this->debug){
echo htmlspecialchars($cmd)."
".$this->lastmsg."
";
flush();
}
if($data[1] != $code) return false;
return true;
}
// smptp ¼¹ö¿¡ Á¢¼ÓÀ» ÇÑ´Ù.
function smtp_connect($host){
if($this->debug){
echo "SMTP($host) Connecting...
";
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);
preg_match("/^([0-9]+).(.*)$/", $line, $data);
$this->lastmsg = $data[0];
if($data[1] != "220") return false;
if($this->debug){
echo $this->lastmsg."
";
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->self == false) {
$username = "isac"; //the login for your smtp
$password = "mail!!qaz321"; //the pass for your smtp
if(!$this->dialogue(334, "AUTH LOGIN")) return false;
if(!$this->dialogue(334, base64_encode($username))) return false;
if(!$this->dialogue(235, base64_encode($password))) 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($path, $name="", $ctype="application/octet-stream"){
if(file_exists($path)){
$fp = fopen($path, "r");
$message = fread($fp, filesize($path));
fclose($fp);
$this->parts[] = array ("ctype" => $ctype, "message" => $message, "name" => $name);
}else return false;
}
// 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){
function build_data($subject, $body, $text_html="y"){
//mail º»¹® html or text Çü½Ä Ãß°¡
if($text_html=="y"){
$body = str_replace("\\","",$body);
$body = $body;
}else{
$body = str_replace("\\","",$body);
$body = htmlspecialchars($body);
$body = nl2br($body);
}
//mail º»¹® html or text Çü½Ä Ãß°¡
$boundary = $this->get_boundary();
$subject = "=?EUC-KR?B?".base64_encode(iconv("UTF-8","EUC-KR",$subject))."?=\r\n";
$mime .= "Subject: ".$subject;
$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(!preg_match("/([\._0-9a-zA-Z-]+)@([0-9a-zA-Z-]+\.[a-zA-Z\.]+)/i", $email, $reg)) return false;
getmxrr($reg[2], $host);
if(!$host) $host[0] = $reg[2];
return $host;
}
// À̸ÞÀÏÀÇ Çü½ÄÀÌ ¸Â´ÂÁö üũÇÑ´Ù.
function get_email($email){
if(!preg_match("/([\._0-9a-zA-Z-]+)@([0-9a-zA-Z-]+\.[a-zA-Z\.]+)/i", $email, $reg)) return false;
return "<".$reg[0].">";
}
// ¸ÞÀÏÀ» Àü¼ÛÇÑ´Ù.
//function send($to, $from, $subject, $body){
function send($to, $from, $subject, $body, $text_html="y"){
if(!is_array($to)) $to = explode("[,;]",$to);
if($this->self){
// $data = $this->build_data($subject, $body);
$data = $this->build_data($subject, $body, $text_html);
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);
$data = $this->build_data($subject, $body, $text_html);
foreach($to as $email) $this->smtp_send($email, $from, $data);
//$this->smtp_close(); -> È£ÃâÆäÀÌÁö¿¡¼ ´Ý¾ÒÀ½
}
}
}//end class
?>