웹마스터 팁



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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

제목 글쓴이 날짜
다른 서버 간 서브도메인 쿠키 공유 에이트 2018.08.04
요즘 제가 jquery 웹앱 솔루션을 개발했습니다. [1] file 안드류KIM 2018.04.03
DB를 손쉽게 관리 [1] EISOFT 2018.07.15
act로 다른 페이지 보여주기 이온디 2018.07.25
CKEditor 이용시 몇가지 유용한 설정 [11] prologos 2015.05.02
Google 스프레드시트에서 구글 번역으로 XE 다국어 내용 만들기(Lang.xml 용도) file 달빛늑대 2018.07.17
Code-Highlighter 3.0.83 가로 스크롤바를 어디론가 보내 버리고 싶으신 분. 달빛늑대 2018.07.16
XE용 CKEditor v4.9.2 (다크 스킨 수정) file 큰돌♡ 2018.07.04
[수정]알림센터 Lite에 메일발송 기능을 추가하기 [13] file 매실茶 2013.11.25
고정도메인 host 변경하기 해피정닷컴 2016.03.11
도메인 변경 또는 설치 폴더 변경시 이미지 주소변경하기 file 해피정닷컴 2018.06.08
게시판글 엑셀 파일 보내기 php7용 file 황금날개 2018.06.05
단축url API 사용하시는 분들... 미스터강 2018.06.01
글 작성시 미리 저장된 서식 불러오기. [10] file 개돌 2009.07.09
[PHP] 이름 및 연락처 마스킹 처리 ppumweb 2018.05.21
새로운 쪽지 유무에 따라 이미지 변경하는 법 [2] 멀티비타민 2013.12.16
관리권한 없이도 특정그룹에게 비밀글 열람 및 댓글작성 권한 부여하는 방법 ( 부운영자등을 위해) sejin7940 2018.04.26
윈도우 8.1 및 윈도우10 에서 IIS + mysql + PHP 설치 [9] file HSJI 2014.07.21
게시판 본문읽기에서 컨텐츠 이미지와 텍스트 분리하여 출력하기 forest535 2018.04.09
EXIF 메타정보 필요하신 분 있으시면 forest535 2018.04.09