-
레거시 php를 이용해 mailgun 사용하기PHP 2020. 6. 26. 11:48728x90
<?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 "메일발송 실패. 실패메세지를 확인하세요.";
}
*/
참고소스
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'PHP' 카테고리의 다른 글
php) 유동변수에 관하여 (0) 2020.09.11 [php]금액을 한글로 변환하기 소스코드 (0) 2020.08.13 PHP 날짜 및 시간 계산 (하루, 일주일, 한달, 다음달,1년 ) (0) 2020.05.31 php JWT토큰 (0) 2020.05.14 php 자동 클래스 불러오기 구현 spl_autoload_register()함수 (0) 2020.03.26