메일건(mailgun) 메일 발송 플러그인 정보
메일건(mailgun) 메일 발송 플러그인관련링크
첨부파일
본문
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 파일 참고
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;
}
13
댓글 전체
그누는 플러그인으로 하다니..ㅠㅠ 암튼 반갑네여 메일건 ㅋㅋ;
아무것도 모르는 상태에서 하다가 얼마나 고생했는지..
저도 php로 처음할때 엄청 헤맸습니다. 특히 결제계좌 연결안되면, 일반 메일은 발송안된다는걸 나중에 알았네요. 영문 가이드문서만 제대로 봐도 알수 있는 것들이었는데..
그렇게 할려면 메일계정을 생성해줘야 합니다.
보통 그런 경우는 쪽지를 이용합니다.
자체해결 했습니다.
제가 해외 웹호스팅을 사용중인데, 뭔가 특이점이 있어서 메일이 발송되지 않는 문제가
발생하여 직접 팁게( 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 무료서비스를 중단해서 개인서버 개인홈페이지에서 이메일 발송에 큰 에로사항이 있는 분들에게 큰 도움이 되겠습니다.
메일건에서는 회원 탈퇴가 어렵습니다.
비회원이 댓글 및 게시글 작성할 때 위와 같은 오류가 나시는 분은 게시판수정->'게시판 기능 설정'에서
메일발송 사용에 체크해제 하시면 됩니다.
지금도 잘 됩니다. 근데 중복 발송 되네요.
중복 발송 해결 하신분 ~~~~
일단 가장 중요한건, 메일건에서 셋팅 + DNS 설정이네요
1차에서 DNS를 안해서 -_-); 안되던데 이젠 잘되네요 ㅠㅠㅠㅠ
5.5버전 이상입니다. 저는 안되네요...ㅠ,.ㅠ