웹마스터 팁



그룹메일 기능 사용시 알림센터 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.20
익산오피 익산출장안마 ⦑출장안마사이트.COM⦒ 익산OP 익산오피 익산오피 koykoyah 2025.02.20
안산오피 ⦑오피사이트.NET⦒ 안산오피 안산출장마사지 안산오피 안산OP koykoyah 2025.02.20
부평오피 ⦑오피사이트.NET⦒ 부평오피 부평출장마사지 부평오피 부평OP koykoyah 2025.02.20
신림오피 ⦑출장마사지안내.COM⦒ 신림오피 신림OP 신림건마 신림오피 koykoyah 2025.02.20
안산오피 안산출장안마 ⦑오피.CLUB⦒ 안산OP 안산오피 안산오피 koykoyah 2025.02.20
신촌오피 ⦑출장안마사이트.COM⦒ 신촌마사지 신촌오피 신촌오피 신촌OP koykoyah 2025.02.20
의정부오피 의정부OP ⦑오피쓰주소.COM⦒ 의정부휴게텔 의정부오피 의정부오피 koykoyah 2025.02.20
대전오피 ⦑오피.CLUB⦒ 대전오피 대전OP 대전건마 대전오피 koykoyah 2025.02.20
해운대오피 해운대오피 ⦑오피쓰주소.COM⦒ 해운대OP 해운대스파 해운대오피 koykoyah 2025.02.20
용인오피 용인출장안마 ⦑오피쓰.COM⦒ 용인OP 용인오피 용인오피 koykoyah 2025.02.20
서면오피 서면OP ⦑오피쓰주소.COM⦒ 서면휴게텔 서면오피 서면오피 koykoyah 2025.02.20
해운대오피 해운대오피 ⦑출장마사지안내.COM⦒ 해운대OP 해운대스파 해운대오피 koykoyah 2025.02.20
대구오피 대구오피 ⦑오피쓰.COM⦒ 대구OP 대구스파 대구오피 koykoyah 2025.02.20
안양오피 안양출장안마 ⦑출장안마사이트.COM⦒ 안양OP 안양오피 안양오피 koykoyah 2025.02.20
신촌오피 신촌OP ⦑오피사이트.NET⦒ 신촌휴게텔 신촌오피 신촌오피 koykoyah 2025.02.20
인천오피 인천오피 ⦑오피사이트.NET⦒ 인천OP 인천스파 인천오피 koykoyah 2025.02.20
울산오피 ⦑오피쓰주소.COM⦒ 울산마사지 울산오피 울산오피 울산OP koykoyah 2025.02.20
부산오피 부산출장안마 ⦑출장안마사이트.COM⦒ 부산OP 부산오피 부산오피 koykoyah 2025.02.20
제주도오피 제주도출장안마 ⦑출장안마사이트.COM⦒ 제주도OP 제주도오피 제주도오피 koykoyah 2025.02.20