웹마스터 팁
[수정]알림센터 Lite에 메일발송 기능을 추가하기
2013.11.25 21:24
그룹메일 기능 사용시 알림센터 DB에 관련내용(필요없는 내용)이 들어가게되는 것 같아 일부 내용 수정하였습니다.
읽기 전에...
본 팁은 PHPMailer를 사용하는 Mail 클래스 객체를 이용한 메일발송 팁입니다.
@BNU님 덕분에 알림센터 Lite를 이용하여 개인홈페이지를 유용하게 운영중이던 차에, 메일 알림 기능이 있으면 좋겠다 싶어 기능을 추가해 본 결과, 온전하게 작동하는 듯 하여 결과물을 공유합니다. 블로그에 적었던 글을 다시 적는 게 많이 귀찮다보니 내용이 많이 축약되어 의미전달이 잘 되지 않을 수 있어 원본 게시글 주소 또한 공유합니다.
원본주소: https://maesiltea.iptime.org/zbxe/diary/57835
또한 작성된 코드는 최적화 된 코드가 아니므로 서버에 부하를 줄 수 있습니다. 그리고 그룹메일 발송 기능은 서버에 큰 부담을 줄 수 있으니 회원수가 많은 사이트의 경우는 별도로 테스트 환경을 갖추어 테스트한 뒤 사용하시길 권장합니다.
쿼리 추가
쿼리XML이 추가됩니다. 특정 그룹에 속한 회원 정보를 얻어오기 위한 쿼리인데, 이게 맞는지 따로 검증은 안 해봤습니다.
<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>님,<br>%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메일이라고 써 있어서 ^^
| 제목 | 글쓴이 | 날짜 |
|---|---|---|
| file 모듈 insertFile() manual_insert 시 디렉토리생성 에러 문제 해결 방법 | onTrust | 2019.01.02 |
| 모듈에서 무조건 JSON/XML 형식으로 출력하기 [1] | Devel0per | 2015.04.03 |
|
새글/업데이트/이미지/동영상/첨부파일 아이콘 없애기
[18]
| 老姜君 | 2008.11.21 |
| 무료 psd, html 탬플릿, 아이콘 사이트공유합니다. | 허허길드짱 | 2018.11.27 |
| act로 다른 페이지 보여주기 [1] | 이온디 | 2018.07.25 |
| 단축url API 사용하시는 분들... | 미스터강 | 2018.06.01 |
|
확장변수값 계산하여 게시판 리스트에 출력하기(총계 게시판)
[1]
| klaist | 2009.11.30 |
| PHP 뮤텍스 락 설치법(memcached 활용) [1] | 에이트 | 2018.09.03 |
| PHP 뮤텍스 락 설치법(redis 활용) | 에이트 | 2018.09.11 |
| 위젯 가운데 정렬 하는법 [3] | 불금 | 2015.07.05 |
|
요즘 제가 jquery 웹앱 솔루션을 개발했습니다.
[2]
| 안드류KIM | 2018.04.03 |
| 썸네일 방식으로 이미지 원본 주소 가져오기 | 에이트 | 2018.08.22 |
| 다른 서버 간 서브도메인 쿠키 공유 | 에이트 | 2018.08.04 |
| DB를 손쉽게 관리 [1] | EISOFT | 2018.07.15 |
| CKEditor 이용시 몇가지 유용한 설정 [11] | prologos | 2015.05.02 |
|
Google 스프레드시트에서 구글 번역으로 XE 다국어 내용 만들기(Lang.xml 용도)
| 달빛늑대 | 2018.07.17 |
| Code-Highlighter 3.0.83 가로 스크롤바를 어디론가 보내 버리고 싶으신 분. | 달빛늑대 | 2018.07.16 |
|
[수정]알림센터 Lite에 메일발송 기능을 추가하기
[11]
| 매실茶 | 2013.11.25 |
| 고정도메인 host 변경하기 | 해피정닷컴 | 2016.03.11 |
|
도메인 변경 또는 설치 폴더 변경시 이미지 주소변경하기
| 해피정닷컴 | 2018.06.08 |
사이트 잘만드셨네요~