diff --git a/lib/mailer.lib.php b/lib/mailer.lib.php index f6ee4e35b..6defb738c 100644 --- a/lib/mailer.lib.php +++ b/lib/mailer.lib.php @@ -3,57 +3,78 @@ if (!defined('_GNUBOARD_')) exit; // 메일 보내기 (파일 여러개 첨부 가능) // type : text=0, html=1, text+html=2 -function mailer($fname, $fmail, $to, $subject, $content, $type=0, $file='', $cc='', $bcc='') -{ - global $config; - global $g4; +function mailer($fname, $fmail, $to, $subject, $content, $type=0, $file="", $cc="", $bcc="") +{ + global $config; + global $g4; - // 메일발송 사용을 하지 않는다면 - if (!$config['cf_email_use']) return; + // 메일발송 사용을 하지 않는다면 + if (!$config['cf_email_use']) return; - $fname = "=?utf-8?B?" . base64_encode($fname) . "?="; - $subject = "=?utf-8?B?" . base64_encode($subject) . "?="; + $boundary = uniqid(time()); - $header = "Return-Path: <$fmail>\n"; - $header .= "From: $fname <$fmail>\n"; - $header .= "Reply-To: <$fmail>\n"; - if ($cc) $header .= "Cc: $cc\n"; - if ($bcc) $header .= "Bcc: $bcc\n"; - $header .= "MIME-Version: 1.0\n"; - $header .= "X-Mailer: {$_SERVER['SERVER_ADDR']} : {$_SERVER['REMOTE_ADDR']} : ".G4_URL." : {$_SERVER['PHP_SELF']} : {$_SERVER['HTTP_REFERER']} \n"; + $header = "Message-ID: <".generate_mail_id(preg_replace("/@.+$/i","",$to)).">\r\n". + "From:=?utf-8?B?".base64_encode($fname)."?=<$fmail>\r\n"; + if ($cc) $header .= "Cc: $cc\n"; + if ($bcc) $header .= "Bcc: $bcc\n"; + $header .= "MIME-Version: 1.0\n"; + $header .= "X-Mailer: SIR Mailer 0.94 : {$_SERVER['SERVER_ADDR']} : {$_SERVER['REMOTE_ADDR']} : ".G4_URL." : {$_SERVER['PHP_SELF']} : {$_SERVER['HTTP_REFERER']} \n"; + $header .= "Date: ".date ("D, j M Y H:i:s T",time())."\r\n". + "To: $to\r\n". + "Subject: =?utf-8?B?".base64_encode($subject)."?=\r\n"; - if ($file != '') { - $boundary = uniqid('http://sir.co.kr/'); - - $header .= "Content-type: MULTIPART/MIXED; BOUNDARY=\"$boundary\"\n\n"; - $header .= "--$boundary\n"; - } - - if ($type) { - $header .= "Content-Type: TEXT/HTML; charset=utf-8\n"; - if ($type == 2) - $content = nl2br($content); + if ($file == "") { + $header .= "Content-Type: MULTIPART/ALTERNATIVE;\n". + " BOUNDARY=\"$boundary\"\n\n"; } else { - $header .= "Content-Type: TEXT/PLAIN; charset=utf-8\n"; - $content = stripslashes($content); + $header .= "Content-Type: MULTIPART/MIXED;\n". + " BOUNDARY=\"$boundary\"\n\n"; } - $header .= "Content-Transfer-Encoding: BASE64\n\n"; - $header .= chunk_split(base64_encode($content)) . "\n"; - if ($file != '') { - foreach ($file as $f) { - $header .= "\n--$boundary\n"; - $header .= "Content-Type: APPLICATION/OCTET-STREAM; name=\"{$f['name']}\"\n"; - $header .= "Content-Transfer-Encoding: BASE64\n"; - $header .= "Content-Disposition: inline; filename=\"{$f['name']}\"\n"; + if ($type == 2) + $content = nl2br($content); - $header .= "\n"; - $header .= chunk_split(base64_encode($f['data'])); - $header .= "\n"; - } - $header .= "--$boundary--\n"; + $strip_content = stripslashes(trim($content)); + $encode_content = chunk_split(base64_encode($strip_content)); + + $body = ""; + $body .= "\n--$boundary\n"; + $body .= "Content-Type: TEXT/PLAIN; charset=utf-8\n"; + $body .= "Content-Transfer-Encoding: BASE64\n\n"; + $body .= $encode_content; + $body .= "\n--$boundary\n"; + + if ($type) { + $body .= "Content-Type: TEXT/HTML; charset=utf-8\n"; + $body .= "Content-Transfer-Encoding: BASE64\n\n"; + $body .= $encode_content; + $body .= "\n--$boundary\n"; + } + + if ($file != "") { + foreach ($file as $f) { + $body .= "n--$boundary\n"; + $body .= "Content-Type: APPLICATION/OCTET-STREAM; name=$fname\n"; + $body .= "Content-Transfer-Encoding: BASE64\n"; + $body .= "Content-Disposition: inline; filename=$fname\n"; + + $body .= "\n"; + $body .= chunk_split(base64_encode($f['data'])); + $body .= "\n"; + } + $body .= "--$boundary--\n"; + } + + $mails['to'] = $to; + $mails['from'] = $fmail; + $mails['text'] = $header.$body; + + if (defined(G4_SMTP)) { + ini_set('SMTP', G4_SMTP); + @mail($to, $subject, $body, $header, "-f $fmail"); + } else { + new maildaemon($mails); } - @mail($to, $subject, "", $header); } // 파일 첨부시 @@ -167,4 +188,175 @@ function verify_email($address, &$error) $error = '메일 교환기에 도달하지 못하였습니다.'; return false; } + + +# jsboard 의 메일보내기 class를 추가합니다. 130808 + +# mail 보내기 함수 2001.11.30 김정균 +# $Id: include/sendmail.php,v 1.4 2009/11/19 05:29:51 oops Exp $ + +# 서버상의 smtp daemon 에 의존하지 않고 직접 발송하는 smtp class +# +# 특정 배열로 class 에 전달을 하여 메일을 발송한다. 배열은 아래을 참조한다. +# +# debug -> debug 를 할지 안할지를 결정한다. +# ofhtml -> 웹상에서 사용할지 쉘상에서 사용할지를 결정한다. +# from -> 메일을 발송하는 사람의 메일주소 +# to -> 메일을 받을 사람의 메일 주소 +# text -> 헤더 내용을 포함한 메일 본문 +# +class maildaemon { + var $failed = 0; + + function __construct($v) { + $this->debug = $v['debug']; + $this->ofhtml = $v['ofhtml']; + if($_SERVER['SERVER_NAME']) $this->helo = $_SERVER['SERVER_NAME']; + if(!$this->helo || preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/i",$this->helo)) + $this->helo = "JSBoardMessage"; + + $this->from = $v['from']; + $this->to = $v['to']; + $this->body = $v['text']."\r\n."; + + //die($v['text']); + $this->newline = $this->ofhtml ? "
\n" : "\n"; + + $this->mx = $this->getMX($this->to); + + if($this->debug) { + echo "DEBUG: ".$this->mx." start".$this->newline; + echo "################################################################".$this->newline; + } + $this->sockets("open"); + $this->send("HELO ".$this->helo); + $this->send("MAIL FROM: <".$this->from.">"); + $this->send("RCPT TO: <".$this->to.">"); + $this->send("data"); + $this->send($this->body); + $this->send("quit"); + $this->sockets("close"); + } + + function getMX($email) { + $dev = explode("@",$email); + $account = $dev[0]; + $host = $dev[1]; + + if(checkdnsrr($host,"MX") && getmxrr($host,$mx,$weight)) { + $idx = 0; + for($i=0;$i $weight[$i]) { + $dest = $weight[$i]; + $idx = $i; + } + } + } else return $host; + return $mx[$idx]; + } + + # 디버그 함수 + # $t -> 1 (debug of socket open,close) + # 0 (regular smtp message) + # $p -> 1 (print detail debug) + # + # return 1 -> success + # return 0 -> failed + # + function debug($str,$t=0,$p=0) { + if($t) { + if(!$str) $this->failed = 1; + if($this->sock) $returnmsg = trim(fgets($this->sock,1024)); + } else { + if(!preg_match("/^(220|221|250|251|354)$/",substr(trim($str),0,3))) + $this->failed = 1; + } + + # DEBUG mode -> 모든 메세지 출력 + if($p) { + if($t) { + $str = "Conncet ".$this->mx; + $str .= $this->failed ? " Failed" : " Success"; + $str .= $this->newline."DEBUG: $returnmsg"; + } + echo "DEBUG: $str".$this->newline; + } + + # DEBUG 모드가 아닐때, 에러 메세지 출력 + if(!$p && $this->failed) { + if($this->ofhtml) echo "\n"; + else "ERROR: $str\n"; + } + } + + function sockets($option=0) { + switch($option) { + case "open" : + $this->sock = @fsockopen($this->mx,25,$this->errno,$this->errstr,30); + $this->debug($this->sock,1,$this->debug); + break; + default : + if($this->sock) fclose($this->sock); + break; + } + } + + function send($str,$chk=0) { + if(!$this->failed) { + if($this->debug) { + if(preg_match("/\r\n/",trim($str))) + $str_debug = trim(str_replace("\r\n","\r\n ",$str)); + else $str_debug = $str; + } + fputs($this->sock,"$str\r\n"); + $recv = trim(fgets($this->sock,1024)); + $recvchk = $recv; + $this->debug($recv,0,$this->debug); + + if(preg_match("/Mail From:/i",$str) && preg_match("/exist|require|error/i",$recvchk) && !$chk) { + $this->failed = 0; + $this->send("MAIL FROM: <".$this->to.">",1); + } + } + } +} + + +function generate_mail_id($uid) { + $id = date("YmdHis",time()); + mt_srand((float) microtime() * 1000000); + $randval = mt_rand(); + $id .= $randval."@$uid"; + return $id; +} + + +function mail_header($to,$from,$title,$mta=0) { + global $langs,$boundary; + + # mail header 를 작성 + $boundary = get_boundary_msg(); + $header = "Message-ID: <".generate_mail_id(preg_replace("/@.+$/i","",$to)).">\r\n". + "From:=?utf-8?B?".base64_encode('보내는사람')."?=<$from>\r\n". + "MIME-Version: 1.0\r\n"; + + if(!$mta) $header .= "Date: ".date ("D, j M Y H:i:s T",time())."\r\n". + "To: $to\r\n". + "Subject: $title\r\n"; + + $header .= "Content-Type: multipart/alternative;\r\n". + " boundary=\"$boundary\"\r\n\r\n"; + + return $header; +} + + +function get_boundary_msg() { + $uniqchr = uniqid(""); + $one = strtoupper($uniqchr[0]); + $two = strtoupper(substr($uniqchr,0,8)); + $three = strtoupper(substr(strrev($uniqchr),0,8)); + return "----=_NextPart_000_000${one}_${two}.${three}"; +} ?> \ No newline at end of file