그누보드 메일 발송기록 페이지 > 그누보드5 팁자료실

그누보드5 팁자료실

그누보드 메일 발송기록 페이지 정보

그누보드 메일 발송기록 페이지

본문

회원메일 발송기록 확인페이지입니다. 
---------------------------------------------------------------------------------------------------
1. 로그 테이블

만들기

CREATE TABLE IF NOT EXISTS g5_mail_member_log (
  ml_id        INT(11) NOT NULL AUTO_INCREMENT,
  ma_id        INT(11) NOT NULL DEFAULT 0,          -- g5_mail.ma_id (캠페인 ID)
  ml_mb_id     VARCHAR(20)  NOT NULL DEFAULT '',    -- 회원 아이디
  ml_mb_email  VARCHAR(255) NOT NULL DEFAULT '',    -- 회원 이메일
  ml_mb_name   VARCHAR(50)  NOT NULL DEFAULT '',    -- 이름
  ml_mb_nick   VARCHAR(50)  NOT NULL DEFAULT '',    -- 닉네임
  ml_result    ENUM('Y','N') NOT NULL DEFAULT 'Y',  -- 발송 성공/실패
  ml_datetime  DATETIME NOT NULL,                   -- 발송 시각
  ml_ip        VARCHAR(45) NOT NULL DEFAULT '',     -- 발송한 관리자 IP
  PRIMARY KEY (ml_id),
  KEY idx_ma_id (ma_id),
  KEY idx_mb_id (ml_mb_id),
  KEY idx_datetime (ml_datetime)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

---------------------------------------------------------------------------------------------------

2. /adm/mail_select_update.php 수정




$cnt = 0; 이부분 찾아서 전체수정.


$cnt = 0;
for ($i = 0; $i < count($member_list); $i++) {

    list($to_email, $mb_id, $name, $nick, $datetime) = explode("||", trim($member_list[$i]));

    $sw = preg_match("/[0-9a-zA-Z_]+(\.[0-9a-zA-Z_]+)*@[0-9a-zA-Z_]+(\.[0-9a-zA-Z_]+)*/", $to_email);

    // 올바른 메일 주소만
    if ($sw == true) {
        $cnt++;
        $mb_md5 = md5($mb_id . $to_email . $datetime);

        $content = $ma['ma_content'];
        $content = preg_replace("/{이름}/", $name, (string)$content);
        $content = preg_replace("/{닉네임}/", $nick, (string)$content);
        $content = preg_replace("/{회원아이디}/", $mb_id, (string)$content);
        $content = preg_replace("/{이메일}/", $to_email, (string)$content);
        $content = $content . "<hr size=0><p><span style='font-size:9pt; font-family:굴림'>▶ 더 이상 정보 수신을 원치 않으시면 [<a href='" . G5_BBS_URL . "/email_stop.php?mb_id={$mb_id}&mb_md5={$mb_md5}' target='_blank'>수신거부</a>] 해 주십시오.</span></p>";

        // ─────────────────────────────
        // ① 메일 발송
        // ─────────────────────────────
        $is_mail_sent = mailer(
            $config['cf_admin_email_name'],
            $config['cf_admin_email'],
            $to_email,
            $subject,
            $content,
            1
        );

        // ─────────────────────────────
        // ② 발송 로그 기록
        // ─────────────────────────────
        $log_sql = "
            INSERT INTO g5_mail_member_log
                   SET ma_id        = '{$ma_id}',
                       ml_mb_id     = '" . sql_escape_string($mb_id) . "',
                       ml_mb_email  = '" . sql_escape_string($to_email) . "',
                       ml_mb_name   = '" . sql_escape_string($name) . "',
                       ml_mb_nick   = '" . sql_escape_string($nick) . "',
                       ml_result    = '" . ($is_mail_sent ? 'Y' : 'N') . "',
                       ml_datetime  = '" . G5_TIME_YMDHIS . "',
                       ml_ip        = '" . $_SERVER['REMOTE_ADDR'] . "'
        ";
        sql_query($log_sql);

        // ─────────────────────────────
        // ③ 화면 출력 부분 (원래 코드 그대로)
        // ─────────────────────────────
        echo "<script> document.all.cont.innerHTML += '$cnt. $to_email ($mb_id : $name)<br>'; </script>\n";
        //echo "+";
        flush();
        ob_flush();
        ob_end_flush();
        usleep($sleepsec);

        if ($cnt % $countgap == 0) {
            echo "<script> document.all.cont.innerHTML += '<br>'; document.body.scrollTop += 1000; </script>\n";
        }

        // 화면을 지운다... 부하를 줄임
        if ($cnt % $maxscreen == 0) {
            echo "<script> document.all.cont.innerHTML = ''; document.body.scrollTop += 1000; </script>\n";
        }
    }
}

 

---------------------------------------------------------------------------------------------------

 





3. 기록확인 화면

생성

/adm/mail_member_log.php





 

 

<?php
$sub_menu = "200400"; // 회원메일발송과 같은 권한 사용
include_once('./_common.php');

auth_check_menu($auth, $sub_menu, 'r');

$g5['title'] = '회원메일 발송기록';

// 검색 파라미터
$fr_date   = isset($_GET['fr_date']) ? preg_replace('/[^0-9\-]/', '', $_GET['fr_date']) : '';
$to_date   = isset($_GET['to_date']) ? preg_replace('/[^0-9\-]/', '', $_GET['to_date']) : '';
$ml_result = isset($_GET['ml_result']) ? preg_replace('/[^YN]/', '', $_GET['ml_result']) : '';
$sfl       = isset($_GET['sfl']) ? trim($_GET['sfl']) : 'l.ml_mb_id';
$stx       = isset($_GET['stx']) ? trim($_GET['stx']) : '';

// sfl 화이트리스트
$allowed_sfl = array(
    'l.ml_mb_id'    => 'l.ml_mb_id',
    'l.ml_mb_email' => 'l.ml_mb_email',
    'l.ml_mb_name'  => 'l.ml_mb_name',
    'l.ml_mb_nick'  => 'l.ml_mb_nick',
    'm.ma_subject'  => 'm.ma_subject',
);
if (!array_key_exists($sfl, $allowed_sfl)) {
    $sfl = 'l.ml_mb_id';
}

$sql_common = "
    FROM g5_mail_member_log AS l
    LEFT JOIN {$g5['mail_table']} AS m ON l.ma_id = m.ma_id
";

$sql_search = " WHERE 1 ";

// 날짜 검색
if ($fr_date) {
    $sql_search .= " AND l.ml_datetime >= '{$fr_date} 00:00:00' ";
}
if ($to_date) {
    $sql_search .= " AND l.ml_datetime <= '{$to_date} 23:59:59' ";
}

// 발송 결과(Y/N) 검색
if ($ml_result !== '') {
    $sql_search .= " AND l.ml_result = '{$ml_result}' ";
}

// 텍스트 검색
if ($stx && $sfl) {
    $stx = sql_real_escape_string($stx);
    $sql_search .= " AND {$sfl} LIKE '%{$stx}%' ";
}

// 전체 건수
$sql = " SELECT COUNT(*) AS cnt {$sql_common} {$sql_search} ";
$row = sql_fetch($sql);
$total_count = isset($row['cnt']) ? (int)$row['cnt'] : 0;

// 페이징 설정
$rows = 50;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
if ($page < 1) $page = 1;

$total_page   = $total_count > 0 ? (int)ceil($total_count / $rows) : 1;
$from_record  = ($page - 1) * $rows;

// 실제 데이터 조회
$sql = "
    SELECT l.*, m.ma_subject
    {$sql_common}
    {$sql_search}
    ORDER BY l.ml_id DESC
    LIMIT {$from_record}, {$rows}
";
$result = sql_query($sql);

// 쿼리스트링
$qstr = "fr_date={$fr_date}&to_date={$to_date}&ml_result={$ml_result}&sfl={$sfl}&stx=" . urlencode($stx);

include_once('./admin.head.php');
?>

<div class="local_ov01 local_ov">
    총 <?php echo number_format($total_count); ?>건의 발송기록이 있습니다.
</div>

<div class="local_sch local_sch01">
    <form id="fsearch" name="fsearch" method="get">
        <input type="hidden" name="page" value="1">

        <label for="fr_date" class="sound_only">시작일</label>
        <input type="date" name="fr_date" id="fr_date" value="<?php echo $fr_date; ?>" class="frm_input" style="width:130px;">
        ~
        <label for="to_date" class="sound_only">종료일</label>
        <input type="date" name="to_date" id="to_date" value="<?php echo $to_date; ?>" class="frm_input" style="width:130px;">

          

        <label for="ml_result">결과</label>
        <select name="ml_result" id="ml_result">
            <option value="" <?php echo $ml_result === '' ? 'selected' : ''; ?>>전체</option>
            <option value="Y" <?php echo $ml_result === 'Y' ? 'selected' : ''; ?>>성공</option>
            <option value="N" <?php echo $ml_result === 'N' ? 'selected' : ''; ?>>실패</option>
        </select>

          

        <select name="sfl" id="sfl">
            <option value="l.ml_mb_id"    <?php echo $sfl === 'l.ml_mb_id' ? 'selected' : ''; ?>>회원아이디</option>
            <option value="l.ml_mb_email" <?php echo $sfl === 'l.ml_mb_email' ? 'selected' : ''; ?>>이메일</option>
            <option value="l.ml_mb_name"  <?php echo $sfl === 'l.ml_mb_name' ? 'selected' : ''; ?>>이름</option>
            <option value="l.ml_mb_nick"  <?php echo $sfl === 'l.ml_mb_nick' ? 'selected' : ''; ?>>닉네임</option>
            <option value="m.ma_subject"  <?php echo $sfl === 'm.ma_subject' ? 'selected' : ''; ?>>캠페인제목</option>
        </select>

        <label for="stx" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
        <input type="text" name="stx" id="stx" value="<?php echo get_text($stx); ?>" class="frm_input" size="30">

        <input type="submit" class="btn_submit" value="검색">
    </form>
</div>

<div class="tbl_head01 tbl_wrap">
    <table>
        <caption><?php echo $g5['title']; ?> 목록</caption>
        <thead>
        <tr>
            <th scope="col">번호</th>
            <th scope="col">발송일시</th>
            <th scope="col">캠페인(ID / 제목)</th>
            <th scope="col">회원아이디</th>
            <th scope="col">이름 / 닉네임</th>
            <th scope="col">E-mail</th>
            <th scope="col">결과</th>
            <th scope="col">IP</th>
        </tr>
        </thead>
        <tbody>
        <?php
        if ($total_count == 0) {
        ?>
        <tr>
            <td colspan="8" class="empty_table">발송기록이 없습니다.</td>
        </tr>
        <?php
        } else {
            for ($i = 0; $row = sql_fetch_array($result); $i++) {
                $num = $total_count - ($page - 1) * $rows - $i;
                $bg  = 'bg' . ($i % 2);

                $datetime = substr($row['ml_datetime'], 0, 16); // yyyy-mm-dd hh:ii
                $ma_subject = get_text($row['ma_subject']);
                if ($ma_subject === '') {
                    $ma_subject = '-';
                }

                $result_txt = ($row['ml_result'] === 'Y') ? '성공' : '실패';
                $result_color = ($row['ml_result'] === 'Y') ? '#15803d' : '#b91c1c';
        ?>
        <tr class="<?php echo $bg; ?>">
            <td class="td_num"><?php echo $num; ?></td>
            <td class="td_datetime"><?php echo $datetime; ?></td>
            <td class="td_left">
                <span class="sv_sbj">
                    [<?php echo $row['ma_id']; ?>]
                    <?php echo $ma_subject; ?>
                </span>
            </td>
            <td class="td_mbid"><?php echo get_text($row['ml_mb_id']); ?></td>
            <td class="td_mbname">
                <?php echo get_text($row['ml_mb_name']); ?>
                <?php if ($row['ml_mb_nick']) { ?>
                    <span class="sv_nick">(<?php echo get_text($row['ml_mb_nick']); ?>)</span>
                <?php } ?>
            </td>
            <td class="td_email"><?php echo get_text($row['ml_mb_email']); ?></td>
            <td class="td_numsmall">
                <span style="color:<?php echo $result_color; ?>; font-weight:bold;">
                    <?php echo $result_txt; ?>
                </span>
            </td>
            <td class="td_ip"><?php echo get_text($row['ml_ip']); ?></td>
        </tr>
        <?php
            }
        }
        ?>
        </tbody>
    </table>
</div>

<div class="local_frm01 local_frm">
    <?php
    echo get_paging($config['cf_write_pages'], $page, $total_page, "./mail_member_log.php?{$qstr}&page=");
    ?>
</div>

<?php
include_once('./admin.tail.php');

 

---------------------------------------------------------------------------------------------------


4. 관리자 메뉴추가



/adm/admin.menu200.php



 

array("200400", "회원메일 발송기록", G5_ADMIN_URL."/mail_member_log.php", "mb_mail"),

추천
3

댓글 3개

전체 1 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT