웹마스터 팁



그룹메일 기능 사용시 알림센터 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();
        }
    }


결과 화면

 

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

9976b7fda5ce744e37ad51e67dd47bcc.png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

제목 글쓴이 날짜
본문 링크 새창으로 띄우기.. [9] 멀티비타민 2013.11.11
레이아웃을 불려오지 않게 하는 코드 [4] 착한악마 2013.11.13
다운로드 랭킹 위젯 simulz 님 스킨 단락 흐트러짐 문제 해결 [2] socialskyo 2013.11.14
Content 확장위젯2 에서 권한설정 안되던 버그 xe1.7 garnecia 2013.11.18
모바일 게시판 사용시 글 수정 / 댓글 수정 누르면 <br/> 태그가 뜰때 팁 [12] 사쿠냥ㅋ 2013.11.19
도메인이 바뀐후 기본 URL을 바꿨지만 2차메뉴의 링크는 바뀌지 않은 경우. [9] Ryuj 2013.11.20
롤링 배너 이해하는데 도움이 될것 같아 올립니다 [4] file 예뜨락 2013.11.22
'본문내 이미지 조절 애드온' 이 페이지모듈에서는 자동으로 작동 안 하게 하는 방법 sejin7940 2013.11.23
댓글창 배경이미지 클릭시 사라지게 만들기 [2] 귀머거리하늘 2013.11.23
에디터 "입력창 크기 자동조절" 체크를 기본으로 하기 [8] 투씨 2013.11.24
AXISJ AXUpload5(HTML5) 파일첨부란 높이 조정하는 방법 [6] 착한악마 2013.11.25
[수정]알림센터 Lite에 메일발송 기능을 추가하기 [11] file 매실茶 2013.11.25
[수정] 댓글 삭제 간략화하기 [9] XE만세 2013.11.26
디자인을 위한 팁...Adobe Generator for Photoshop CC [7] kj1212_ 2013.11.26
메시지톡 버튼 게시판에 넣기 [18] file 착한악마 2013.11.26
phpMyAdmin 사용시 주의 사항 [2] explode 2013.11.27
추천/비추천/신고시 확인(메시지 창 띄우기)하기 [21] explode 2013.11.27
multimedia file 첨부 시 자동으로 jw player 로 설정 더뿌 2013.11.27
SSL 적용시 작은 iframe 없애기 [1] file explode 2013.11.28
라르게덴님의 Xpresseditor + AXISJ AXUpload5(HTML5)와 mex_default 스킨 [5] 투씨 2013.11.29