테스트 사이트 - 개발 중인 베타 버전입니다

메일건(mailgun) 메일 발송 플러그인

· 7년 전 · 12779 · 43
mailgun-wordpress-460x132.png

1. 플러그인 설명
- 그누보드에서 mailgun 을 통해 메일을 발송하는 플러그인입니다.
- 별다른 추가 작업없이 mailgun(메일건)으로 발송할수 있도록 코딩하였습니다.


2. mailgun(메일건) 메일 서비스 사용시 장점
- 발송메일에 대한 상세한 추적이 가능합니다.
 : 메일을 수신하지 못한 경우, 어떤 문제로 메일을 수신하지 못하였는지 추적이 가능합니다.
 : 메일건에서 상세한 메일 리포팅을 제공해 줍니다. 메일의 개봉률과 기타 통계를 확인할수 있습니다.
- 메일건 설정(dkim, spf등)을 정확히 하였다면, 기본적으로 메일이 스팸으로 등록되지 않습니다.
- 메일발송시 원본 서버의 아이피가 노출되지 않습니다. 아이피가 노출되어 ddos 공격을 받는 경우가 줄어듭니다. 
  (클라우드플레어와 같은 cdn과 dns 서비스를 활용하여 원본 아이피를 숨기는 경우가 있는데, 자체 sendmail로 메일을 발송하면, 원본 서버의 아이피가 노출되게 됩니다.)


3. 디렉토리 및 파일 구조
/lib/mailer.lib.php ?(기존 함수를 old 함수로 변경)
/lib/Mailgun.php 메일건 메일발송용 class 파일
/README.txt 설명파일
/mail_test.php (메일 테스트 파일)


4. 설치및 사용방법
- mailgun 서비스를 등록합니다.

 (https://ho9.me/works/gulim/449 참고)
- 압축파일을 푼다음 각 파일 위치에 맞게 서버에 업로드 합니다.
- /lib/Mailgun.php 파일에서 maildomain 정보와 mailgun_api_key 정보를 설정합니다.
- 웹에서 mail_test.php 를 실행하여 정상적으로 메일이 발송되는지 확인합니다.


5. 주의사항
- mailgun 설정이 완료되어 메일발송이 가능하여야 합니다.
- php에서 curl 사용이 가능하여야 합니다.(보통 가능하도록 설정되어 있습니다.)
- 파일첨부?기능은 php5.6 이상에서만 정상 동작합니다. 그 이하 버전에선 테스트되지 않았음으로 정상 발송도지 않을수 있습니다.(그누보드에서 메일발송시 파일첨부하는 경우는 거의 없습니다.)

 

6. 기타
- 기존 함수로 메일을 발송하는 경우에 mailer.lib.php 파일에서 mail.lib.php mailer() 함수의 코드를 아래와 같이 주석처리하세요.
   //if(true) { //메일건 메일러를 사용하지 않는 경우 코드를 주석처리하시면 기존 코드로 메일을 발송합니다.
   //     mailgun_mailer($fname, $fmail, $to, $subject, $content, $type=0, $file, $cc, $bcc);
   //}

 

mailer.lib.php 파일 참고

[code]


if (!defined('_GNUBOARD_')) exit;

include_once(G5_PHPMAILER_PATH.'/PHPMailerAutoload.php');

// 메일 보내기 (파일 여러개 첨부 가능)
// type : text=0, html=1, text+html=2
function mailer($fname, $fmail, $to, $subject, $content, $type=0, $file="", $cc="", $bcc="")
{
    global $config;
    global $g5;

    if(true) { //메일건 메일러를 사용하지 않는 경우 코드를 주석처리하시면 기존 코드로 메일을 발송합니다.
        mailgun_mailer($fname, $fmail, $to, $subject, $content, $type=0, $file, $cc, $bcc);
    }

    // 메일발송 사용을 하지 않는다면
    if (!$config['cf_email_use']) return;

    if ($type != 1)
        $content = nl2br($content);

    $mail = new PHPMailer(); // defaults to using php "mail()"
    if (defined('G5_SMTP') && G5_SMTP) {
        $mail->IsSMTP(); // telling the class to use SMTP
        $mail->Host = G5_SMTP; // SMTP server
        if(defined('G5_SMTP_PORT') && G5_SMTP_PORT)
            $mail->Port = G5_SMTP_PORT;
    }
    $mail->CharSet = 'UTF-8';
    $mail->From = $fmail;
    $mail->FromName = $fname;
    $mail->Subject = $subject;
    $mail->AltBody = ""; // optional, comment out and test
    $mail->msgHTML($content);
    $mail->addAddress($to);
    if ($cc)
        $mail->addCC($cc);
    if ($bcc)
        $mail->addBCC($bcc);
    //print_r2($file); exit;
    if ($file != "") {
        foreach ($file as $f) {
            $mail->addAttachment($f['path'], $f['name']);
        }
    }
    return $mail->send();
}

function mailgun_mailer($fname, $fmail, $to, $subject, $content, $type=0, $files=array(), $cc="", $bcc="")
{
    global $config;
    global $g5;

    // 메일발송 사용을 하지 않는다면
    if (!$config['cf_email_use']) return;
    include_once(G5_LIB_PATH.'/Mailgun.php');

    if ($type != 1)
        $content = nl2br($content);

    $mail = new Mailgun();


    $from = $fname ? $fname."<".$fmail.">" : $fmail;

    $mail->from($from);
    $mail->to($to);

    if ($cc) {
        $mail->cc($cc);
    }
    if ($bcc) {
        $mail->bcc($bcc);
    }

    $mail->subject($subject);
    $mail->message($content);


    foreach ($files as $f) {
        if(file_exists($f)) {
            $mail->attach($f);
        }
    }

    $result = $mail->send();

    if($result) { //결과에제 { "id": "<20180424063106.1.846B8B39F91CFE6D@yourdoamin>", "message": "Queued. Thank you." }
        $result_arr = json_decode($result, true);
        if($result_arr['message'] == "Queued. Thank you.") {
           return TRUE;
        } else {
            //메일이 정상 발송되지 않는 경우에, 아래코드의 주석을 제거 하고 오류 원인을 확인하세요.
            //FIXME 테스트후 반드시 주석처리
           print_r($result_arr);
           exit;
        }
    }

    return FALSE;
}


// 파일을 첨부함
function attach_file($filename, $tmp_name)
{
    // 서버에 업로드 되는 파일은 확장자를 주지 않는다. (보안 취약점)
    $dest_file = G5_DATA_PATH.'/tmp/'.str_replace('/', '_', $tmp_name);
    move_uploaded_file($tmp_name, $dest_file);
    $tmpfile = array("name" => $filename, "path" => $dest_file);
    return $tmpfile;
}

[/code]

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 43개

잘 쓰겠습니다. 너무 감사합니다.
지금도 잘 됩니다. 근데 중복 발송 되네요.
중복 발송 해결 하신분 ~~~~
후 1차에서 실패했지만, 2차에서 성공했네요..

일단 가장 중요한건, 메일건에서 셋팅 + DNS 설정이네요

1차에서 DNS를 안해서 -_-); 안되던데 이젠 잘되네요 ㅠㅠㅠㅠ

5.5버전 이상입니다. 저는 안되네요...ㅠ,.ㅠ