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

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

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개

아.. 이런것도 있었네요. 감사합니다. 유용한 정보입니다.
감사합니다. 적용해봐야겠네요
말로만 듣던 메일건이군요. 좋은자료 감사합니다.
와우. 얼마전에 파이썬에서 메일건 발송 때문에 고생했었는데..
그누는 플러그인으로 하다니..ㅠㅠ 암튼 반갑네여 메일건 ㅋㅋ;
아무것도 모르는 상태에서 하다가 얼마나 고생했는지..
토닥토닥.. 힘내세요. 다들 그러면서 새로운거 배우는거죠.
저도 php로 처음할때 엄청 헤맸습니다. 특히 결제계좌 연결안되면, 일반 메일은 발송안된다는걸 나중에 알았네요. 영문 가이드문서만 제대로 봐도 알수 있는 것들이었는데..
고수는 역시 다르네요..잘 쓰겠습니다..
좋은 자료 가 올라왔네요..
오 감사합니다. 잘 사용할께요
와.. 만들고 있었는데.. 먼저만드셨네요 대단합니다
나중에 설치해 봐야겠습니다.. 메일발송이 늘 부담이긴 합니다.
고맙습니다 설치해 보겠습니다
혹시 고객의 메일 정보가 메일건 서버에 기록되거나 하진 않을까요?
포인트 모아서 잘 쓰겠습니다 감사합니다
이거 회원이 회원에게도 메일을 보낼 수 있나요?!
회원이 회원한테 메일을 보내는 기능은 안됩니다.
그렇게 할려면 메일계정을 생성해줘야 합니다.

보통 그런 경우는 쪽지를 이용합니다.
먼가 스팸으로 들어가는것도잇네요.
정말 감사합니다 복많으실거에요
파일 다운받고 싶은데...ㅠ 포인트가 부족하네용 ㅠ
감사합니다. 포인트 모아서 다운받아서 설치했는데 너무 좋습니다. bbbb 다시한번 감사드리고싶어서 댓글답니다.
감사합니다! 잘 사용하겠습니다!
18.09.17 15:26:31

자체해결 했습니다.
제가 해외 웹호스팅을 사용중인데, 뭔가 특이점이 있어서 메일이 발송되지 않는 문제가
발생하여 직접 팁게( https://sir.kr/g5_tip/6398 )에 올려놓은 대로
define('G5_SMTP', '127.0.0.1'); 에서 define('G5_SMTP', ''); 로 변경해서
사용 중이였는데, 이게 문제점이 되서 중복 발송 된 것 같습니다.

혹시 저와 같은 문제를 겪을 분들에게 도움이 될까 하여 기록해 놓습니다.

=======================================================
18.09.17 13:32:31

좋은 자료 감사합니다!
위에 설명하신 대로 업로드 한 후 메일 발송에는 성공했습니다만
도착하는 메일을 살펴보면, 똑같은 메세지가 중복으로 두개씩이나 날라오는데요.
혹시 이런 문제는 겪으시지는 않으셨나요?
gmail, daum, naver, protonmail 등등 한 10개의 이메일 업체를 전부 테스트 해봤는데
전부 중복으로 가더라고요.

메일건에서 로그를 살펴보면, Accepted에서 메일발송, Delivered 과정에서 메일발송
이렇게 동시에 같은 내용이 두 건의 메일이 발송되는 일이 발생해서 (모든 메일이 전부)
일단은 메일건 측에도 문의를 해놓은 상태인데요.

명량폐인님은 혹시 이런 문제를 겪으시지는 않으셨는지 궁금해서 여쭤봅니다.
그누보드 버전은 5.2.9.8.1 을 사용하고 있고, 코어는 건들이지 않았습니다.

암튼 이런 좋은 플러그인을 개발해주셔서 감사합니다.

=====================================================
18.09.17 15:10:11

추가사항

gmail에 메일건 smtp를 통해 메일을 발송하면, 중복발송되는 일 없이
한 번만 발송이 되네요.
이제서야 댓글을 봤네요. 잘 해결되셨다니 다행입니다.^^
받고 싶은데 포인트가 없네요
잘 작동 되는가 봅니다. 댓글을 보면 말이죠.
네이버가 Smtp 무료서비스를 중단해서 개인서버 개인홈페이지에서 이메일 발송에 큰 에로사항이 있는 분들에게 큰 도움이 되겠습니다.
필요하던거네요 감사합니다.
구굴에서 외부로 보내는 SMTP 차단 시키네요.
메일건에서는 회원 탈퇴가 어렵습니다.
Array ( [message] => 'from' parameter is not a valid address. please check documentation )

비회원이 댓글 및 게시글 작성할 때 위와 같은 오류가 나시는 분은 게시판수정->'게시판 기능 설정'에서
메일발송 사용에 체크해제 하시면 됩니다.
메일이 안오네요...
테스트해봐야겠네요 감사합니다
(https://ho9.me/works/gulim/449 참고) 이게 링크 하면 Error 가 나네요~ ^^
테스트 예정으로 감사 드립니다.
환상적인 자료네요!
혹시 메일 발송에 딜레이가 발생하지는 않나요? (회원가입 인증메일 등)
감사합니다
좋은정보 감사합니다
지금도 되는지 모르겠지만 해보겠습니당
잘 쓰겠습니다. 너무 감사합니다.
지금도 잘 됩니다. 근데 중복 발송 되네요.
중복 발송 해결 하신분 ~~~~
후 1차에서 실패했지만, 2차에서 성공했네요..

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

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

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

게시판 목록

그누보드5 플러그인

그누보드 호환이거나 독립적으로 실행되는 플러그인을 소개합니다.
글쓰기
🐛 버그신고