ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 레거시 php를 이용해 mailgun 사용하기
    PHP 2020. 6. 26. 11:48
    728x90

    <?php

     

    class Mailgun {

     

        private $mailgun_domain = "yourdomain"; //mailgun에 등록한 메일발송 입력합니다.

        private $mailgun_apikey = "mailgun api key"; //mailgun apikey를 입력합니다. key- 로 시작합니다.

        private $_to = "";

        private $_cc = "";

        private $_bcc = "";

        private $_from = "";

        private $_subject = "";

        private $_message = "";

        private $_attachments = array();

     

        public function __construct() {

     

        }

     

        public function __destruct() {

     

        }

     

        public function clear() {

            $this->_to = "";

            $this->_cc = "";

            $this->_bcc = "";

            $this->_from = "";

            $this->_subject = "";

            $this->_message = "";

            $this->_attachments = array();

        }

     

        public function to($to){

            $this->_to = $to;

        }

     

        public function cc($cc){

            $this->_cc = $cc;

        }

     

        public function bcc($bcc){

            $this->_bcc = $bcc;

        }

     

        public function from($from){

            $this->_from = $from;

        }

     

        public function subject($subject){

            $this->_subject = $subject;

        }

     

        public function message($message){

            $this->_message = $message;

        }

     

        public function attachments($attachments){

            $this->_attachments[] = $attachments;

        }

     

        public function attach($attachment){

            return $this->attachments($attachment);

        }

     

        public function send(){

     

            $url = "https://api.mailgun.net/v3/".$this->mailgun_domain."/messages";

     

            $ch = curl_init();

            curl_setopt($ch, CURLOPT_HTTPHEADER, array(

                'Content-Type: multipart/form-data',

            ));

            curl_setopt($ch, CURLOPT_URL, $url);

            curl_setopt($ch, CURLOPT_USERPWD, "api:" . $this->mailgun_apikey);

            curl_setopt($ch, CURLOPT_POST, 1);

            $data = array(

                'to' => $this->_to,

                'from' => $this->_from,

                'subject' => $this->_subject,

                'html' => $this->_message,

            );

     

            if($this->_cc){

                $data["cc"] = $this->_cc;

            }

            if($this->_bcc){

                $data["bcc"] = $this->_bcc;

            }

            for($i = 0; $i < count($this->_attachments); $i++){

                //$data["attachment[" . ($i+1) . "]"] = "@" . $this->_attachments[$i];

               // $data["attachment"] = "@" . $this->_attachments[$i];

     

                if(file_exists($this->_attachments[$i])) { //파일용량이 크면 반송될수 있다.

                    $mime_type = mime_content_type($this->_attachments[$i]);

                    $file_pathinfo = pathinfo($this->_attachments[$i]);

                    $data["attachment[" . ($i+1) . "]"]  = new \CurlFile($this->_attachments[$i], $mime_type, $file_pathinfo['basename']); //php 5.6 이상에서 동작합니다.

                }

            }

     

            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

     

            $output = curl_exec ($ch);

     

            if(curl_errno($ch)) {

                //echo 'Curl error: ' . curl_error($ch);

                //return FALSE;

            }

            return $output;

        }

    }

    ?>

     

    발송용 함수

    function mailgun_mailer($fname, $fmail, $to, $subject, $content, $type=0, $files=array(), $cc="", $bcc="")

    {

     

        include_once(__DIR__.'/lib/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;

    }

     

    //테스트용 코드

    //일반 메일 발송 테스트

    $fmail = "postmaster@yourdomain"; //보내는사람 메일주소(메일건 기본값은 postmaster@도메인명 입니다.)

    $to = "abcd@abcd.com"; //받는사람 메일주소

    $subject = "메일건 테스트 메일입니다.";

    $content = "메일건 테스트 메일입니다(본문)..";

     

     

    $is_send = mailgun_mailer("테스트", $fmail , $to, $subject, $content);

     

    if($is_send) {

        echo "메일발송 성공";

    } else {

        echo "메일발송 실패. 실패메세지를 확인하세요.";

    }

     

    //파일첨부 메일 테스트

    /*

    $subject = "메일건 테스트 메일(파일첨부)입니다.";

    $content = "메일건 테스트 메일입니다(본문)..파일이 첨부되어 있습니다.";

     

    $files = array();

    $files[] = realpath(__DIR__."/attach1.png");

    $files[] = realpath(__DIR__."/attach2.png");

     

    $is_send = mailgun_mailer("테스트", $fmail , $to, $subject, $content, 0, $files);

     

    if($is_send) {

        echo "메일발송 성공";

    } else {

        echo "메일발송 실패. 실패메세지를 확인하세요.";

    }

    */

     

    참고소스 

    출처 - https://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=82026&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%BD%BA%C6%D4&sop=

     

    WWW.PHPSCHOOL.COM

    개발자 커뮤니티 1위 PHPSCHOOL.COM 입니다.

    phpschool.com

     

    php5.2 버전대에 적용시킬려다 보니 시행 착오가 있었는데

    저거 그대로 쓰면 

    Curl error: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

    에러가 난다

     

    그래서 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 위에다가

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    이 두가지를 추가해준다.

    그리고  https://app.mailgun.com/메일건 가서 시키는대로 따라해서 만들고

    도메인과 apikey 넣어서 사용하면된다

    728x90
Designed by Tistory.