PHP

레거시 php를 이용해 mailgun 사용하기

Dev갱이 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