강좌&TIP/PHP2008/03/27 07:24

현재 NMail 을 정품을 구매해 사용중입니다.

얼마전에 NMail 사이트의 Q&A 에 '스팸 편지'가 아웃룩으로 받아지는것을 막을 방법이 없는지 문으했었습니다.

대답은 메일코어쪽 까지 수정해야되서 처리 할수가 없다는 답변이었습니다.

그래서 고민 끝에 메일을 받을때 개인 필터를 적용하는 방법을 생각해 봤습니다.

처음에는 클론으로 1분마다 스팸 포인트가 1.5 이상인 것을 자동 삭제 또는 지운 편지함으로 이동시키게 만들었는데 서버 부하도 크고 1분 사이에 메일을 긁어갈 경우가 있어서 좋은 방법이 아니더군요 .(정말 무식한 방법 ㅠ.ㅠ)

그 다음 생각한게 서버에서 모니터링을 하다보니 filter.sh.php 가 메일이 받아지면 실행 된다는 것을 알게되었습니다. 필터를 쓰도록 옵션을 설정한 사람만 해당 필터가 작동하는 듯 하더군요 .

그래서 수정을 해봤습니다. 적용후 궁금한 사항은 리플로 남겨주세요.

1. Nmail PHP 2.3.1 버전에서 만들어진 소스입니다.
2. /NMail 설치된 폴더/nmail/filter.sh.php를 vi 나 다른 에디터를 통해 수정모드로 갑니다.
3. line 12 or 13 줄에 있는 $exitcode = mail_filter(true, $G_SYS[VIRUS_SCAN]); 와 다음 줄의 exit($exitcode); 를 확인합니다.
   ( * 확인해보니 $exitcode = mail_filter(true, $G_SYS[VIRUS_SCAN]); 이 함수가 동작후 메일이 DB에 등록되고 각 개인별 폴더로 이동 됩니다. )
  
4. exit($exitcode); 바로 윗줄에 다음과 같은 소스를 추가합니다.

// 스팸 편지 이동 필터 by Choi hyun pil - 2008.03.26 - 시작
  // 아래 설정은 '스팸메일 설정' -> '상세설정' 에있는 "안티스팸메일에서 제목에 [FAKE]가 붙는 위조메일은 바로 삭제.(권장)" 라는 항목을
  // "[FAKE]가 붙는 위조메일은 바로 삭제 및 [스팸편지함]에서 스팸포인트(SP)가 1.4 이상일때 [지운편지함]으로 이동." 으로 내용을 변경후 사용.
  // 여기서 1.4 포인트는 수정 가능합니다.
  // 해당 파일은 /Nmail설치폴더/nmail/skin/webmail/사용중인스킨명/spam_config.html 임
  // 이를 적용시 서버에 부하가 증가할 수 있습니다. 이로 인해 발생하는 문제에 대해서 책임지지 않습니다.
  // * 500명까지 테스트 완료
  $move_spam_point = "1";                                             // 이동의 기준이될 스팸 포인트를 입력하세요. 해당 포인트 초과시 지운편지함으로 이동. Default : 1.4
  $tmp = explode('@', trim($_SERVER['argv'][3]));                     // 받는사람 메일주소를 획득
  $user_id = $tmp[0];                                                 // 받는사람 ID 추출
  $user_domain = $tmp[1];                                             // 받는사람 Domain 추출
  $tmp = explode("/", $_SERVER[argv][1]);                             // spool에 있는 메일의 파일이름경로를 획득
  $mf_filename = basename($_SERVER['argv'][1]);                       // 메일 파일명 추출
  // sc_fake_del 이 "Y"인 사용자 인지 확인.
  $sql = "select
            A.m_no, A.m_id , A.m_mail_file_group , A.d_no
          from
            nmail_member A,
            nmail_spam_config B,
            nmail_domain C
          where
            C.d_name = '".$user_domain."' and
            A.m_no = B.m_no and
            B.sc_fake_del = 'Y' and
            A.d_no = C.d_no and
            A.m_id = '".$user_id."'";
  $result = mysql_query($sql);
  $user_rows = mysql_fetch_array($result);
  if ($user_rows) { // "Y" 일경우 실행
    // 해당 메일정보(메일 ID 및 스팸 포인트)를 읽어옴
    $sql = "select mf_no, mf_filename, mf_spam_point from nmail_mail_file_".$user_rows[d_no]."_".$user_rows[m_mail_file_group]." where m_no = '".$user_rows[m_no]."' and mf_filename = '".$mf_filename."' limit 0, 1";
    $result = mysql_query($sql);
    $mail_rows = mysql_fetch_array($result);
    if ( $mail_rows ) { // 메일이 존재할 경우 실행
      if ( $mail_rows[mf_spam_point] >= $move_spam_point ) {          // 스팸 포인트가 높은지 확인
        $user_tmp_dir = get_mail_dir( $user_rows[m_mail_file_group], $user_id, $user_domain).'/tmp/'.$mf_filename;
        errorlog($user_tmp_dir, 'DEBUG');                             // 사용자 폴더를 제대로 알아냈는지 weblogs/debug 에 기록을 남김.
        rename($_SERVER['argv'][1], $user_tmp_dir);                   // rename 시 에러가 생긴다면 copy 해도 무관함.  반송메일은 자동삭제되기 때문.
        // 메일을 리턴메일없이 반송한 것으로 간주함. (smail- 로그에 기록이 남지 않는 단점이 있음.)
        $exitcode = 4;
        // 해당 메일폴더를 지운편지함(trash)로 변경
        $sql = "UPDATE nmail_mail_file_".$user_rows[d_no]."_".$user_rows[m_mail_file_group] . " SET mb_id = 'trash' WHERE m_no='". $user_rows[m_no] . "' AND mb_id='spam' AND mf_no = '".$mail_rows[mf_no]."'";
        db_query($sql);
      };
    };
  };
//스팸 편지 이동 필터 by Choi hyun pil - 2008.03.26 - 끝

현재 적용후 사용중인데 아주 만족 스럽습니다. ^^

만약 $move_spam_point 를 1로 설정하시면 [SPAM]으로 붙어서 스팸편지함으로 가는 메일은 모두 지운편지함으로 이동합니다. 즉 아웃룩에서 하나도 안받아지게 되죠 ^^
크리에이티브 커먼즈 라이센스
Creative Commons License
블로그코리아에 블UP하기   믹시' 믹시
Posted by 금룡이

Trackback URL : http://myfeeling.info/trackback/102

Leave your greetings.