Member's Skins

테마, 스킨, 위젯 등 아미나 회원자료실

홈 > 회원포럼 > 회원자료실
회원자료실

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

1. 플러그인 설명 

- 그누보드(아미나빌더)에서 mailgun 을 통해 메일을 발송하는 플러그인입니다.

  : 아미나에서 메일발송부분은 그누보드에서 수정한 부분이 없기 때문에 동리한 mailer.lib.php를 쓰게 됩니다.
- 별다른 추가 작업없이 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 파일 참고


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;
}

, , , ,

10 Comments
5 하늘바래 06.17 22:22  
댓글내용 확인
2 명랑폐인 06.18 00:33  
메일발송은 그누보드랑 아미나가 동일한걸로 알고 있습니다.
두개 소스는 동일합니다. 혹시 기능상의 문제가 있다면 알려주세요. 조치하도록 하겠습니다.
5 하늘바래 06.18 00:35  
댓글내용 확인
5 하늘바래 06.18 11:25  
댓글내용 확인
2 명랑폐인 06.18 13:06  
등록절차대로 다 진행하신건가요(카드계좌 연결 포함)
위에 코드에 보시면  FIXME 영역에 주석된걸 해제해보세요. 아마 안되는 오류가 출력될것입니다.
그리고 개인정보가 포함되지 않은 일반적인 질문글은  비밀글로 적지 말아주세요.  비밀글로 올리는건 따로 답변 드리지 않도록 하겠습니다.
보안이 필요한 경우라면 쪽지로 보내주세요.
5 하늘바래 06.18 13:25  
홈페이지 링크때문에 비밀글 작성하였습니다 절차는 다 진행했습니다 지메일에서 도메인메일 발송 테스트까지 했는데 다 정상적으로 발송이 됩니다
14 정우정원 06.19 02:44  
잘되네요. 잘사용하겠습니다.^^
고맙습니다~~
2 명랑폐인 06.19 11:23  
네, 잘되신다니 다행이네요. 쓰시다가 추가되었으면 하는 기능이 있다면 제안주세요.
5 농약 07.20 02:41  
댓글내용 확인
2 명랑폐인 07.20 19:44  
소스를 보면 오류가 나는 경우 주석을 제거 해서 확인해보라는곳이 있습니다.
주석을 제거 하시면 결과 메세지가 출력됩니다. 메세지를 보고서 조치하시면 될것 같습니다.
  1. 별도 라이센스 표기가 없는 경우 다운받으신 자료는 비영리 사이트에서만 사용가능하며, 제작의뢰 또는 납품용으로도 사용할 수 없습니다.
  2. 또한 몰에서 판매하는 자료의 리소스로 활용 또는 단독판매가 불가능하고, 회원자료실에서 재배포도 불가능합니다.
  3. 포인트가 있는 경우 다운로드 후 2개월(60일) 동안은 다시 받더라도 재차감되지 않습니다.
제목
최근 글
최근 댓글
Facebook Twitter GooglePlus KakaoStory NaverBand