그누4 메일 기능을 phpmailer 로 발송하도록 셋팅된 소스가 어디 없을런지 문의해봅니다.

그누4 메일 기능을 phpmailer 로 발송하도록 셋팅된 소스가 어디 없을런지 문의해봅니다.

QA

그누4 메일 기능을 phpmailer 로 발송하도록 셋팅된 소스가 어디 없을런지 문의해봅니다.

본문

수고 많습니다.

네임서버와 이메일 서버와 웹서버를 각각 별도로 구축하여 사용하다보니, 홈페이지에서 외부의 smtp 에일 서버를 이용하여 메일발송을 하여야 하는데, 그누4에 있는 mailer.lib.php 로는 외부 메일서버 이용이 안된다고 본 적이 있습니다.

 

그누5에서는 phpmailer를 사용하기에 외부의 메일서버 이용에 문제가 없는 것으로 알고 있는데, 그누5 처럼 그누4에도 phpmailer 를 이용하여 외부 메일서버를 이용할 수 있도록 셋팅된 소스가 어디 없을런지 문의해봅니다.

 

이메일을 한번만 보낼려고 하는 것이 아니라, 회원가입 메일, 회원 메일 발송 기능 등을  모두 다 phpmailer로 이용할려고 합니다.

phpmailer 소스나 사용법은 검색해서 구해두었지만 이것을 mailer.lib.php 와 어떻게 결합하여야 할지 난감하여 도움을 청합니다. 

유용한 링크가 있으면 좀 알려주시면 갑사하겠습니다.

 

이 질문에 댓글 쓰기 :

답변 3

예전에 그누보드 기본 메일러 기능을 사용하지 못해서, 다른방법으로 보냈었던 소스입니다.

 

참고가 될런지 모르것네요.

 


<?
include_once("./_common.php");
?>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<?
$type = 1;
$content = preg_replace("/\n/", "<br>", $content);


function sendMail($EMAIL, $NAME, $SUBJECT, $CONTENT, $mailto){
 $admin_email = $EMAIL;
 $admin_name  = $NAME;


 $header  = "Return-Path: ".$admin_email."\n";
 $header .= "From: =?utf-8?B?".base64_encode($admin_name)."?= <".$admin_email.">\n";
 $header .= "MIME-Version: 1.0\n";
 $header .= "X-Priority: 3\n";
 $header .= "X-MSMail-Priority: Normal\n";
 $header .= "X-Mailer: FormMailer\n";
 $header .= "Content-Transfer-Encoding: base64\n";
 $header .= "Content-Type: text/html;\n \tcharset=UTF-8\n";


 $subject  = "=?UTF-8?B?".base64_encode($SUBJECT)."?=\n";
 $contents = $CONTENT;


 $message = base64_encode($contents);
 flush();
 @mail($mailto, $subject, $message, $header);
}


//$mailTo        = $name . "<" . $email . ">";
$mailTo = "=?UTF-8?B?".base64_encode($name)."?="."<" . $email . ">\n";
//$mailFrom    = $from_name . "<" . $from . ">";
$mailFrom = "=?UTF-8?B?".base64_encode($from_name)."?="."<" . $from_email . ">\n";




$ct_head = "<p>이벤트 참여자</p>";
$ct_head = "<table>";
//$ct_head .="<tr><td width=100 bgcolor='#F6F6F6'><b>이벤트명</b> </td><td bgcolor='#FFFFFF'> $row[wr_subject]</td></tr>";
$ct_head .="<tr><td width=100 bgcolor='#F6F6F6'><b>이름</b> </td><td bgcolor='#FFFFFF'> $wr_1</td></tr>";
$ct_head .="<tr><td width=100 bgcolor='#F6F6F6'><b>연락처</b> </td><td bgcolor='#FFFFFF'> $wr_2-$wr_3-$wr_4</td></tr>";
$ct_head .="<tr><td width=100 bgcolor='#F6F6F6'><b>이메일</b> </td><td bgcolor='#FFFFFF'> $wr_5</td></tr>";
$ct_head .="<tr><td width=100 bgcolor='#F6F6F6'><b>이벤트등록일자</b> </td><td bgcolor='#FFFFFF'> ".date("Y-m-d H:i:s")."</td></tr>";
$ct_head .="<tr><td width=100 bgcolor='#F6F6F6'><b>유입경로</b> </td><td bgcolor='#FFFFFF'> ".$wr_9."</td></tr>";
$ct_head .= "</table><br>";
$wr_email = $wr_5;


$content = $ct_head.$content;
// html 이면
if ($type){
    $current_url = $g4[url];
    $mail_content = "<html><head><meta http-equiv='content-type' content='text/html; charset=$g4[charset]'><title>메일보내기</title><link rel='stylesheet' href='$current_url/style.css' type='text/css'></head><body>$content</body></html>";
}else {
    $mail_content = $content;
}


$wr_subject = "이벤트 참여 - ".$_POST[wr_1];
//mailer($wr_name, $wr_email, $_POST[wr_6], $wr_subject, $mail_content, $type, $file);
sendMail($wr_email, $wr_name, $wr_subject, $mail_content, $_POST[wr_6]);


alert_close("이벤트 참여를 해주셔서 감사합니다.\\n\\n담당자가 확인후 연락드리겠습니다.","./");
?> 

답변 올려주심에 감사드립니다.

 

제가 질문을 잘 못 올린건지, phpmailer를 사용하는 것이 해결책이 되는건지 분명치 않습니다만,  

질문 올린 취지는 자체 웹서버의 메일 기능은 사용치 않고,  외부 이메일서버의 릴레이 기능을 이용할려고 하는 것입니다.

postfix 메일 서버가 설치되어 있지만 stop 시켜둘려고 합니다.

 

누군가는 소켓 방식 접속을 이용해야 한다는 조언도 있었음을 첨언합니다.

 

 

 

socket 방식 메일 송부 프로그램을 하나 구해서 mailer.lib.php 파일과 결합(?)을 해서 테스트해보고 있는데, 회원 메일 발송을 해보면, 이메일이 날아오기는 옵니다.

그런데, 한글 부분이 깨져서 날아 오네요.   웹서버나 그누 보드나 소스파일이나 모두 다 utf-8 을 사용합니다.

아래 소스 보시고, 한글 부분 깨지지 않도록 손 좀 봐주시면 고맙겠습니다.

 


<? 
// 메일 보내기 (파일 여러개 첨부 가능)
// type : text=0, html=1, text+html=2
//function mailer($fname, $fmail, $to, $subject, $content, $type=0, $file="", $cc="", $bcc="") 
//function mailer($fname, $fmail, $to, $subject, $type, $content)
function mailer($fname, $fmail, $to, $subject, $type, $content, $file="", $cc="", $bcc="")
{
    global $config;
    global $g4;
    // 메일발송 사용을 하지 않는다면
    if (!$config[cf_email_use]) return;
    $fname   = "=?$g4[charset]?B?" . base64_encode($fname) . "?=";
    $subject = "=?$g4[charset]?B?" . base64_encode($subject) . "?=";
    //$g4[charset] = ($g4[charset] != "") ? "charset=$g4[charset]" : "";
    $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: SIR Mailer 0.91 (sir.co.kr) : $_SERVER[SERVER_ADDR] : $_SERVER[REMOTE_ADDR] : $g4[url] : $_SERVER[PHP_SELF] : $_SERVER[HTTP_REFERER] \n";
    // UTF-8 관련 수정
    $header .= "X-Mailer: SIR Mailer 0.92 (sir.co.kr) : $_SERVER[SERVER_ADDR] : $_SERVER[REMOTE_ADDR] : $g4[url] : $_SERVER[PHP_SELF] : $_SERVER[HTTP_REFERER] \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=$g4[charset]\n";
        if ($type == 2)
            $content = nl2br($content);
    } else {
        $header .= "Content-Type: TEXT/PLAIN; charset=$g4[charset]\n";
        $content = stripslashes($content);
    }
    $header .= "Content-Transfer-Encoding: BASE64\n\n";
    //$header .= chunk_split(base64_encode($content)) . "\n";
 $content = 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";
            $header .= "\n";
            $header .= chunk_split(base64_encode($f[data]));
            $header .= "\n";
        }
        $header .= "--$boundary--\n";
    }
//    @mail($to, $subject, "", $header);
function sendmail($fname, $fmail, $to, $subject, $type, $content) { 
    $smtp_id = base64_encode("OOOOOOOOO");//아이디 
    $smtp_pwd = base64_encode("*********");//패스워드 
    $smtp_server = "000.000.000.000";//"EMAIL SERVER"; 
    if (!$fp = fsockopen("$smtp_server", 25)) { 
        die ("Couldn't open mail connection to smtp_server! \n"); 
    } 
    
    fgets($fp, 128); 
    fputs($fp, "helo huso.kr\r\n"); 
    fgets($fp, 128); 
    fputs($fp, "auth login\r\n"); 
    fgets($fp,128); 
    fputs($fp, "$smtp_id\r\n"); 
    fgets($fp,128); 
    fputs($fp, "$smtp_pwd\r\n"); 
    fgets($fp,128);    
    fputs($fp, "mail from: <$fmail>\r\n"); 
    fgets($fp, 128); 
    fputs($fp, "rcpt to: <$to>\r\n"); 
    fgets($fp, 128); 
    fputs($fp, "data\r\n"); 
    fgets($fp, 128); 
    fputs($fp, "Return-Path: $fmail\r\n"); 
    fputs($fp, "From: $fname <$fmail>\r\n"); 
    fputs($fp, "To: <$to>\r\n"); 
    fputs($fp, "Subject: $subject\r\n"); 
//    fputs($fp, "Content-Type: $type charset=utf-8\r\n"); 
//    fputs($fp, "Content-Transfer-Encoding: base64\r\n"); 
//    fputs($fp, "MIME-Version: 1.0\n"); 
//    fputs($fp, "\r\n"); 
//    $content= chunk_split(base64_encode($content)); 
    fputs($fp, $content); 
    fputs($fp, "\r\n.\r\n"); 
    fgets($fp, 128); 
    fclose($fp); 
} 
$fname="OOOOOO";// "보내는사람 이름"; 
$fmail ="*** 개인정보보호를 위한 이메일주소 노출방지 ***";//"보내는사람 메일주소"; 
$subject = "socket 전송 ";//"제목"; 
$type = "text/html"; 
$content = "socket 내용 전송 ";//"메일 내용"; 
$to = "*** 개인정보보호를 위한 이메일주소 노출방지 ***";//"받는사람메일 주소"; 
sendmail($fname, $fmail, $to, $subject, $type, $content); 
}
// 파일 첨부시
/*
$fp = fopen(__FILE__, "r");
$file[] = array(
    "name"=>basename(__FILE__),
    "data"=>fread($fp, filesize(__FILE__)));
fclose($fp);
*/
// 파일을 첨부함
function attach_file($filename, $file)
{
    $fp = fopen($file, "r");
    $tmpfile = array(
        "name" => $filename,
        "data" => fread($fp, filesize($file)));
    fclose($fp);
    return $tmpfile;
}
// 메일 유효성 검사
// core PHP Programming 책 참고
// hanmail.net , hotmail.com , kebi.com 등이 정상적이지 않음으로 사용 불가
function verify_email($address, &$error)
{
    global $g4;
    $WAIT_SECOND = 3; // ?초 기다림
    list($user, $domain) = explode("@", $address);
    // 도메인에 메일 교환기가 존재하는지 검사
    if (checkdnsrr($domain, "MX")) {
        // 메일 교환기 레코드들을 얻는다
        if (!getmxrr($domain, $mxhost, $mxweight)) {
            $error = "메일 교환기를 회수할 수 없음";
            return false;
        }
    } else {
        // 메일 교환기가 없으면, 도메인 자체가 편지를 받는 것으로 간주
        $mxhost[] = $domain;
        $mxweight[] = 1;
    }
    // 메일 교환기 호스트의 배열을 만든다.
    for ($i=0; $i<count($mxhost); $i++)
        $weighted_host[($mxweight[$i])] = $mxhost[$i];
    ksort($weighted_host);
    // 각 호스트를 검사
    foreach($weighted_host as $host) {
        // 호스트의 SMTP 포트에 연결
        if (!($fp = @fsockopen($host, 25))) continue;
        // 220 메세지들은 건너뜀
        // 3초가 지나도 응답이 없으면 포기
        socket_set_blocking($fp, false);
        $stoptime = $g4[server_time] + $WAIT_SECOND;
        $gotresponse = false;
        while (true) {
            // 메일서버로부터 한줄 얻음
            $line = fgets($fp, 1024);
            if (substr($line, 0, 3) == "220") {
                // 타이머를 초기화
                $stoptime = $g4[server_time] + $WAIT_SECOND;
                $gotresponse = true;
            } else if ($line == "" && $gotresponse)
                break;
            else if ($g4[server_time] > $stoptime)
                break;
        }
        // 이 호스트는 응답이 없음. 다음 호스트로 넘어간다
        if (!$gotresponse) continue;
        socket_set_blocking($fp, true);
        // SMTP 서버와의 대화를 시작
        fputs($fp, "HELO $_SERVER[SERVER_NAME]\r\n");
        echo "HELO $_SERVER[SERVER_NAME]\r\n";
        fgets($fp, 1024);
        // From을 설정
        fputs($fp, "MAIL FROM: <info@$domain>\r\n");
        echo "MAIL FROM: <info@$domain>\r\n";
        fgets($fp, 1024);
        // 주소를 시도
        fputs($fp, "RCPT TO: <$address>\r\n");
        echo "RCPT TO: <$address>\r\n";
        $line = fgets($fp, 1024);
        // 연결을 닫음
        fputs($fp, "QUIT\r\n");
        fclose($fp);
        if (substr($line, 0, 3) != "250") {
            // SMTP 서버가 이 주소를 인식하지 못하므로 잘못된 주소임
            $error = $line;
            return false;
        } else
            // 주소를 인식했음
            return true;
    }
    
    $error = "메일 교환기에 도달하지 못하였습니다.";
    return false;
}
?>​

 

답변을 작성하시기 전에 로그인 해주세요.
전체 124,066 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT