웹마스터 팁
[수정]알림센터 Lite에 메일발송 기능을 추가하기
2013.11.25 21:24
그룹메일 기능 사용시 알림센터 DB에 관련내용(필요없는 내용)이 들어가게되는 것 같아 일부 내용 수정하였습니다.
읽기 전에...
본 팁은 PHPMailer를 사용하는 Mail 클래스 객체를 이용한 메일발송 팁입니다.
@BNU님 덕분에 알림센터 Lite를 이용하여 개인홈페이지를 유용하게 운영중이던 차에, 메일 알림 기능이 있으면 좋겠다 싶어 기능을 추가해 본 결과, 온전하게 작동하는 듯 하여 결과물을 공유합니다. 블로그에 적었던 글을 다시 적는 게 많이 귀찮다보니 내용이 많이 축약되어 의미전달이 잘 되지 않을 수 있어 원본 게시글 주소 또한 공유합니다.
원본주소: https://maesiltea.iptime.org/zbxe/diary/57835
또한 작성된 코드는 최적화 된 코드가 아니므로 서버에 부하를 줄 수 있습니다. 그리고 그룹메일 발송 기능은 서버에 큰 부담을 줄 수 있으니 회원수가 많은 사이트의 경우는 별도로 테스트 환경을 갖추어 테스트한 뒤 사용하시길 권장합니다.
쿼리 추가
쿼리XML이 추가됩니다. 특정 그룹에 속한 회원 정보를 얻어오기 위한 쿼리인데, 이게 맞는지 따로 검증은 안 해봤습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | < query id = "getMemberListByGroupSrl" action = "select" > < tables > < table name = "member_group_member" /> </ tables > < columns > < column name = "member_srl" /> </ columns > < conditions > < condition operation = "equal" column = "group_srl" var = "group_srl" notnull = "notnull" /> </ conditions > </ query > |
소스코드 수정
알림센터 Lite 모듈의 ncenterlite.controller.php 파일을 수정하면 됩니다. 다음 세 가지 정도 됩니다.
1. _getMentionTarget()함수
가장 먼저 _getMentionTarget()함수입니다. 색칠된 부분이 변경된 부분입니다. 원본 파일 내용과 비교하여 수정하면 됩니다.
function _getMentionTarget( $content ) { $oNcenterliteModel = &getModel( 'ncenterlite' ); $config = $oNcenterliteModel ->getConfig(); $logged_info = Context::get( 'logged_info' ); $list = array (); $content = strip_tags ( $content ); $content = str_replace ( ' ' , ' ' , $content ); // 정규표현식 정리 $split = array (); if (in_array( 'comma' , $config ->mention_format)) $split [] = ',' ; $regx = join( '' , array ( '/(^|\s)@([^@\s' , join( '' , $split ), ']+)/i' )); preg_match_all( $regx , $content , $matches ); // '님'문자 이후 제거 if (in_array( 'respect' , $config ->mention_format)) { foreach ( $matches [2] as $idx => $item ) { $pos = strpos ( $item , '님' ); if ( $pos !== false && $pos > 0) { $matches [2][ $idx ] = trim( substr ( $item , 0, $pos )); if ( $logged_info && $logged_info ->nick_name == $matches [2][ $idx ]) unset( $matches [2][ $idx ]); } } } $nicks = array_unique ( $matches [2]); foreach ( $nicks as $nick_name ) { $vars = null; $vars ->nick_name = $nick_name ; $output = executeQuery( 'ncenterlite.getMemberSrlByNickName' , $vars ); //이곳에서 닉네임이 찾아지는지 확인한 후에 해당 닉네임 정보를 넘김 if ( $output ->data && $output ->data->member_srl) { $list [] = $output ->data->member_srl; //닉네임이 없으면, 그룹이름으로 확인한다! } else { //모든 그룹 리스트 불러오기 $oModuleMember = &getModel( 'member' ); $group_list = $oModuleMember ->getGroups(); foreach ( $group_list as $group_info ){ if ( $group_info ->title == $nick_name ){ //group_srl을 가져온다. $list [] = $group_info ->group_srl; $args ->member_srl = $group_info ->group_srl; break ; } } } } return $list ; } |
2. _insertNotify() 함수 수정 (수정됨)
_insertNotify()함수부분도 수정합니다.
function _insertNotify( $args , $anonymous = FALSE) { // 비회원 노티 제거 if ( $args ->member_srl <= 0) return new Ob ject(); // XE 포럼 금지어 문제로 띄어쓰기 하였습니다. $logged_info = Context::get( 'logged_info' ); if ( $anonymous == TRUE) { // 익명 노티 시 회원정보 제거 $args ->target_member_srl = 0; $args ->target_nick_name = 'Anonymous' ; $args ->target_user_id = 'Anonymous' ; $args ->target_email_address = 'Anonymous' ; } else if ( $logged_info ) { // 익명 노티가 아닐 때 로그인 세션의 회원정보 넣기 $args ->target_member_srl = $logged_info ->member_srl; $args ->target_nick_name = $logged_info ->nick_name; $args ->target_user_id = $logged_info ->user_id; $args ->target_email_address = $logged_info ->email_address; } else { // 비회원 $args ->target_member_srl = 0; $args ->target_user_id = '' ; } //이곳에서 DB에 알림이 기록되기 전에 메일을 발송할 수 있다. //그룹메일인지 여부 선정 $oModuleMember = &getModel( 'member' ); $group_info = $oModuleMember ->getGroup( $args ->member_srl); if ( $group_info && $group_info ->group_srl) { $this ->_sendMail( $args , true); //그룹메일을 쿼리문까지 진행하면 안 되므로 종료 return ; } else { $this ->_sendMail( $args ); } $output = executeQuery( 'ncenterlite.insertNotify' , $args ); return $output ; } |
3. _sendMail() 함수 추가 (수정됨)
마지막로는 기존에 작성했던, 이메일 발송 함수인 _sendMail() 함수를 추가하시면 됩니다. 색칠된 부분은 자신의 환경에 맞게 수정하시면 됩니다.
function _sendMail( $args , $group = false){ //수신자 메일과 이름은 member_srl로부터 추출해야 함 $oModuleMember = &getModel( 'member' ); global $lang ; $logged_info = Context::get( 'logged_info' ); if ( $group ){ //지금 보내는 사람이 최고관리자가 아니면, 보내지 않는다. if ( $logged_info ->is_admin != 'Y' ) return ; //그룹메일 발송 $_args ->group_srl = $args ->member_srl; $output = executeQueryArray( 'ncenterlite.getMemberListByGroupSrl' , $_args ); if (! $output ->data) $output ->data = array (); //if(!$output->toBool()) return; //그룹메일 발송준비 $oMail = new Mail(); $oMail ->setTitle( '[매실茶의 나른한 오후] 알림센터' ); $oMail ->setSender( '관리자' , '------@------.com' ); $message = sprintf('<h2>알림센터</h2><p>%s님으로부터 그룹알림이 도착했습니다. 꼭 읽어보세요.</p><h2>상세정보</h2><h3>내용</h3><p>%s</p><h3>바로가 기</h3><ul><li><a href= "%s" >%s</a></li></ul>', $args ->target_nick_name, $args ->target_summary, $args ->target_url, $args ->target_url); $oMail ->setContent( $message ); //수신자 다 집어넣기 foreach ( $output ->data as $member ){ $member_info = $oModuleMember ->getMemberInfoByMemberSrl( $member ->member_srl); //수신자가 메일링 동의를 하지 않았으면, 보내지 않는다. if ( $member_info ->allow_mailing != 'Y' ) continue ; $oMail ->setReceiptor( $member_info ->nick_name, $member_info ->email_address); } //메일 발송 $oMail ->send(); //그룹메일은 알림센터 DB와 연동되는 것이 아니므로 메일만 보내고 끝낸다. return ; } else { //개인 메일 발송 $member_info = $oModuleMember ->getMemberInfoByMemberSrl( $args ->member_srl); //수신자가 메일링 동의를 하지 않았으면, 보내지 않는다. if ( $member_info ->allow_mailing != 'Y' ) return ; // 알림 형태에 따라 넣을 메시지 선정 $_type = "" ; switch ( $args ->type){ case 'D' : $_type = $lang ->ncenterlite_document; //$type = '글'; break ; case 'C' : $_type = $lang ->ncenterlite_comment; //$type = '댓글'; break ; case 'E' : $_type = $lang ->ncenterlite_type_message; //$type = '쪽지'; break ; } $_content = "" ; switch ( $args ->target_type) { case 'M' : $_content = sprintf( $lang ->ncenterlite_mentioned, $args ->target_nick_name, $args ->target_summary, $_type ); break ; case 'C' : $_content = sprintf( $lang ->ncenterlite_commented, $args ->target_nick_name, $_type , $args ->target_summary); break ; case 'E' : $_content = sprintf( $lang ->ncenterlite_message_string, $args ->target_summary); break ; } // url 합치기 $message = sprintf('<h2>알림센터</h2><p><strong>%s</strong>님, %s 꼭 읽어보세요.</p><h2>상세정보</h2><h3>내용</h3><p>%s</p><h3>바로가기</h3><ul><li><a href= "%s" >%s</a></li></ul>', $member_info ->nick_name, $_content , $args ->target_summary, $args ->target_url, $args ->target_url); // send a Mail $oMail = new Mail(); $oMail ->setTitle( '[매실茶의 나른한 오후] 알림센터' ); $oMail ->setContent( $message ); //웹마스터 정보 로드 $oMail ->setSender( '관리자' , '-----@-----.com' ); //발신자 정보를 기록한다. //$oMail->setSender( $args->target_nick_name, $args->mail_address); //수신자 정보를 기록한다. $oMail ->setReceiptor( $member_info ->nick_name, $member_info ->email_address); $oMail ->send(); } } |
결과 화면
@그룹 으로 호출하면 다음과 같은 메일이 도착하게 됩니다. 단, 쪽지알림 메일의 경우는 정상동작하지 않는 것 같습니다. 그냥 참고만 해 주세요 ^^
댓글 11
-
고맙습니다. 그냥 개인적으로 사용하려고 운영하고 있습니다.
-
조금만 더 생각해 보자면,
메일 세팅의 상당 부분을 모듈 옵션으로 처리가 가능할 것 같습니다.
그렇게 하면 일반 코드를 모르는 사용자 분들도 쉽게 사용 가능할 듯 합니다.
-
그건 다른분이 해결해 주실거라 생각하고 올렸습니다.
직장다니면서 세세한 부분까지 건드리기가 쉽지가 않네요 ^^;
-
@BNU 님~!
이 라이트 버전을 개조해서 사업에 써먹어도 되나요~?
-
제작자는 아니지만 다운로드 페이지에 적혀있기로 알림센터 Lite 버전은 GPL2 이므로 해당 라이센스의 제약사항만 잘 숙지하시고 사용하시면 될 것 같습니다.
-
BJ람보
2013.11.26 01:41
그룹발송 발송준비(?) 아래 3번째줄
$oMail
->setSender(
'관리자'
, ------@------.com');
부분 오타 있는듯 합니다.
$oMail
->setSender(
'관리자'
, '------@------.com');
으로 바꾸는게 맞지요?
-
맞겠죠?ㅋㅋ
제 계정 적혀있던걸 지우면서 작은따옴표가 빠졌네요 -
헉 근데 지메일 화면 어떻게 저렇게 바꾸셨나요? 커스텀 해도 저렇겐 안되던데
-
windows 8.1의 기본 메일 앱에서 찍은겁니다.
-
아 그렇군요.. g메일이라고 써 있어서 ^^
사이트 잘만드셨네요~