웹마스터 팁



그룹메일 기능 사용시 알림센터 DB에 관련내용(필요없는 내용)이 들어가게되는 것 같아 일부 내용 수정하였습니다.

읽기 전에...

본 팁은 PHPMailer를 사용하는 Mail 클래스 객체를 이용한 메일발송 팁입니다.

 

@BNU님 덕분에 알림센터 Lite를 이용하여 개인홈페이지를 유용하게 운영중이던 차에, 메일 알림 기능이 있으면 좋겠다 싶어 기능을 추가해 본 결과, 온전하게 작동하는 듯 하여 결과물을 공유합니다. 블로그에 적었던 글을 다시 적는 게 많이 귀찮다보니 내용이 많이 축약되어 의미전달이 잘 되지 않을 수 있어 원본 게시글 주소 또한 공유합니다.

원본주소: https://maesiltea.iptime.org/zbxe/diary/57835

또한 작성된 코드는 최적화 된 코드가 아니므로 서버에 부하를 줄 수 있습니다. 그리고 그룹메일 발송 기능은 서버에 큰 부담을 줄 수 있으니 회원수가 많은 사이트의 경우는 별도로 테스트 환경을 갖추어 테스트한 뒤 사용하시길 권장합니다.

 

쿼리 추가

쿼리XML이 추가됩니다. 특정 그룹에 속한 회원 정보를 얻어오기 위한 쿼리인데, 이게 맞는지 따로 검증은 안 해봤습니다.

 

modules/ncenterlite/queries/getMemberListByGroupSrl.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()함수입니다. 색칠된 부분이 변경된 부분입니다. 원본 파일 내용과 비교하여 수정하면 됩니다.

 

ncenterlite.controller.php 파일의 _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()함수부분도 수정합니다.

_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() 함수를 추가하시면 됩니다. 색칠된 부분은 자신의 환경에 맞게 수정하시면 됩니다.

 

ncenterlite.controller.php 파일의 _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();
        }
    }


결과 화면

 

@그룹 으로 호출하면 다음과 같은 메일이 도착하게 됩니다. 단, 쪽지알림 메일의 경우는 정상동작하지 않는 것 같습니다. 그냥 참고만 해 주세요 ^^

9976b7fda5ce744e37ad51e67dd47bcc.png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

제목 글쓴이 날짜
답십리오피 ⦑오피.CLUB⦒ 답십리오피 답십리OP 답십리건마 답십리오피 koykoyah 2025.02.23
세종오피 세종출장안마 ⦑출장마사지안내.COM⦒ 세종OP 세종오피 세종오피 koykoyah 2025.02.23
강북오피 ⦑오피.CLUB⦒ 강북오피 강북출장마사지 강북오피 강북OP koykoyah 2025.02.23
포항오피 ⦑오피쓰주소.COM⦒ 포항OP 포항오피 포항출장샵 포항오피 koykoyah 2025.02.23
동두천오피 ⦑오피.CLUB⦒ 동두천OP 동두천오피 동두천출장샵 동두천오피 koykoyah 2025.02.23
부평오피 부평OP ⦑오피쓰주소.COM⦒ 부평휴게텔 부평오피 부평오피 koykoyah 2025.02.23
강남오피 ⦑오피쓰주소.COM⦒ 강남OP 강남오피 강남출장샵 강남오피 koykoyah 2025.02.23
판교오피 ⦑출장안마사이트.COM⦒ 판교오피 판교출장마사지 판교오피 판교OP koykoyah 2025.02.23
신림오피 ⦑출장안마사이트.COM⦒ 신림오피 신림OP 신림건마 신림오피 koykoyah 2025.02.23
강북오피 강북OP ⦑출장마사지안내.COM⦒ 강북휴게텔 강북오피 강북오피 koykoyah 2025.02.23
답십리오피 ⦑오피쓰.COM⦒ 답십리오피 답십리OP 답십리건마 답십리오피 koykoyah 2025.02.23
강북1인샵【출장안마사이트.COM】강북안마 강북스웨디시 강북마사지 songkangkong767 2025.02.23
수원마사지【출장마사지안내.COM】수원스웨디시 수원1인샵 수원안마 songkangkong767 2025.02.23
서초스웨디시【오피사이트.NET】서초스웨디시 서초 스웨디시 서초스웨디시 songkangkong767 2025.02.23
가락1인샵【오피쓰.COM】가락마사지 가락안마 가락스웨디시 songkangkong767 2025.02.23
충주마사지【출장마사지안내.COM】충주스웨디시 충주1인샵 충주안마 songkangkong767 2025.02.23
안산1인샵【오피쓰.COM】안산1인샵 안산 1인샵 안산1인샵 songkangkong767 2025.02.23
세종마사지【출장마사지안내.COM】세종 마사지 세종마사지 세종마사지 songkangkong767 2025.02.23
전주안마【출장마사지안내.COM】전주 안마 전주안마 전주안마 songkangkong767 2025.02.23
일산오피 ⦑오피쓰.COM⦒ 일산OP 일산오피 일산출장샵 일산오피 koykoyah 2025.02.23