jsboard 의 maildaemon 및 관련 함수를 추가 했습니다. 한메일로 메일이 발송되지 않던 오류 해결

This commit is contained in:
gnuboard
2013-08-08 11:38:26 +09:00
parent a232452025
commit 5a74ca5fba

View File

@ -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 ? "<br>\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<sizeof($mx);$i++) {
$dest = $dest ? $dest : $weight[$i];
if($dest > $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 "<SCRIPT>\nalert('$str')\n</SCRIPT>\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}";
}
?>