ISPConfig · 4 min read · Nov 15, 2025

ISPConfig 2.x: ISPConfig 설치에 "스팸으로 이동" 옵션 추가하는 방법

ISPConfig 2.x: ISPConfig 설치에 “스팸으로 이동” 옵션 추가하는 방법

버전 1.0b
저자: Jens Groh

개요:

이 문서는 ISPConfig 2.x 설치에 세 번째 스팸 필터 전략을 추가하는 데 필요한 단계를 설명합니다. 이를 통해 귀하와 귀하의 사용자는 스팸을 삭제할지, 허용할지, 해당 IMAP 정크 메일 폴더로 이동할지를 선택할 수 있습니다.

이 방법은 ‘grant’의 포럼 스레드(https://www.howtoforge.com/forums/showthread.php?t=15704)에서 영감을 받아 스팸 삭제 전략을 이동으로 교환하는 방법을 설명합니다. 아래 단계를 따르면 삭제 방법을 대체하는 것이 아니라 세 번째 방법을 추가하게 됩니다.

전제 조건:

이 방법에서는 다음 또는 유사한 구성을 사용한다고 가정합니다:

  • ISPConfig (v2.2.23 이상)
  • 설정 및 실행 중인 최소 하나의 도메인과 메일박스
  • IMAP은 Maildir 형식을 사용하고 있습니다 (mbox에서는 작동하지 않습니다!)

1단계 - 양식 변경

첫 번째 단계는 Admin 계정으로 ISPConfig 패널에 로그인하는 것입니다. 그런 다음 Administration 탭에 들어가 Edit Form으로 Form Designer를 엽니다. isp - ISP User를 검색하고 edit를 클릭합니다.
이제 해당 양식의 전체 설명을 볼 수 있습니다. spam_strategy를 찾아 다시 edit를 클릭합니다.
이제 향후 이동 옵션을 위해 해당 양식 요소의 Value list를 다음과 같이 변경합니다:

accept,accept;
move,move;
discard,discard;

그리고 해당 양식을 저장합니다. 이제 도메인의 메일 사용자 옵션에서 스팸 전략 드롭다운 상자에 새로운 옵션이 표시되어야 합니다 - 비록 아직 기능은 없지만요. 이제 콘솔 부분으로 넘어가서 ISPConfig 파일을 편집하여 새로운 옵션에 생명을 불어넣어 보겠습니다.

2단계 - ISPConfig 소스 파일 편집

이제 여러 파일을 편집해야 합니다. 아래에 나열하고 나중에 설명하겠습니다:

vi /root/ispconfig/scripts/lib/classes/ispconfig_procmail.lib.php

(약 109번째 줄):

         if(!is_dir($web_path."/user/".$user_username."/Maildir"))
$mod->log->caselog("maildirmake
".$web_path."/user/".$user_username."/Maildir &> /dev/null", "maildirmake
".$web_path."/user/".$user_username."/Maildir &> /dev/null", __LINE__);
        // ADD: IMAP 하위 폴더 생성
        if(!is_dir($web_path."/user/".$user_username."/Maildir/.Drafts"))
$mod->log->caselog("maildirmake
".$web_path."/user/".$user_username."/Maildir/.Drafts &> /dev/null",
"maildirmake ".$web_path."/user/".$user_username."/Maildir/.Drafts &>
/dev/null", __LINE__);
        if(!is_dir($web_path."/user/".$user_username."/Maildir/.Junk"))
$mod->log->caselog("maildirmake
".$web_path."/user/".$user_username."/Maildir/.Junk &> /dev/null",
"maildirmake ".$web_path."/user/".$user_username."/Maildir/.Junk &>
/dev/null", __LINE__);
        if(!is_dir($web_path."/user/".$user_username."/Maildir/.Sent"))
$mod->log->caselog("maildirmake
".$web_path."/user/".$user_username."/Maildir/.Sent &> /dev/null",
"maildirmake ".$web_path."/user/".$user_username."/Maildir/.Sent &>
/dev/null", __LINE__);
        if(!is_dir($web_path."/user/".$user_username."/Maildir/.Trash"))
$mod->log->caselog("maildirmake
".$web_path."/user/".$user_username."/Maildir/.Trash &> /dev/null",
"maildirmake ".$web_path."/user/".$user_username."/Maildir/.Trash &>
/dev/null", __LINE__);
 
     if(!is_dir($web_path."/user/".$user_username."/Maildir"))
$mod->log->phpcaselog(mkdir($web_path."/user/".$user_username."/Maildir",
0700), "create ".$web_path."/user/".$user_username."/Maildir", $this->FILE,
__LINE__);
 
        // ADD: IMAP 하위 폴더 생성
        if(!is_dir($web_path."/user/".$user_username."/Maildir/.Drafts"))
$mod->log->phpcaselog(mkdir($web_path."/user/".$user_username."/Maildir/.Drafts",
0700), "create ".$web_path."/user/".$user_username."/Maildir/.Drafts",
$this->FILE, __LINE__);
        if(!is_dir($web_path."/user/".$user_username."/Maildir/.Junk"))
$mod->log->phpcaselog(mkdir($web_path."/user/".$user_username."/Maildir/.Junk",
0700), "create ".$web_path."/user/".$user_username."/Maildir/.Junk",
$this->FILE, __LINE__);
  if(!is_dir($web_path."/user/".$user_username."/Maildir/.Sent"))
$mod->log->phpcaselog(mkdir($web_path."/user/".$user_username."/Maildir/.Sent",
0700), "create ".$web_path."/user/".$user_username."/Maildir/.Sent",
$this->FILE, __LINE__);
  if(!is_dir($web_path."/user/".$user_username."/Maildir/.Trash"))
$mod->log->phpcaselog(mkdir($web_path."/user/".$user_username."/Maildir/.Trash",
0700), "create ".$web_path."/user/".$user_username."/Maildir/.Trash",
$this->FILE, __LINE__);
 
     exec("chown -R ".$user_username.":web".$web_doc_id."
".$web_path."/user/".$user_username."/Maildir");
     exec("chmod 700 ".$web_path."/user/".$user_username."/Maildir");
 
  // ADD: IMAP 하위 폴더 생성
  exec("chown -R ".$user_username.":web".$web_doc_id."
".$web_path."/user/".$user_username."/Maildir/.Drafts");
  exec("chmod 700 ".$web_path."/user/".$user_username."/Maildir/.Drafts");
  exec("chown -R ".$user_username.":web".$web_doc_id."
".$web_path."/user/".$user_username."/Maildir/.Junk");
  exec("chmod 700 ".$web_path."/user/".$user_username."/Maildir/.Junk");
  exec("chown -R ".$user_username.":web".$web_doc_id."
".$web_path."/user/".$user_username."/Maildir/.Sent");
  exec("chmod 700 ".$web_path."/user/".$user_username."/Maildir/.Sent");
  exec("chown -R ".$user_username.":web".$web_doc_id."
".$web_path."/user/".$user_username."/Maildir/.Trash");
  exec("chmod 700 ".$web_path."/user/".$user_username."/Maildir/.Trash");
 
     if($user["user_admin"]){
       exec("rm -f $web_path/Maildir &> /dev/null");
      
$mod->log->phpcaselog(@symlink($web_path."/user/".$user_username."/Maildir",
$web_path."/Maildir"), "symlink ".$web_path."/Maildir", $this->FILE,
__LINE__);

(약 300번째 줄)

   $mod->tpl->define( array(table    => "spamassassin.rc.master"));
 
   if(!isset($user["spam_strategy"])) $user["spam_strategy"] = "accept";

   if($user["spam_strategy"] == "accept"){
     $spam_comment = "#";
     $spam_command = ".Junk/";
   } else {
     $spam_comment = "";
     if($user["spam_strategy"] == "discard"){
       $spam_command = "/dev/null";
     } else {
       $spam_command = ".Junk/";
     }
   }

(약 330번째 줄)


if(is_file('/home/admispconfig/ispconfig/tools/spamassassin/usr/local/bin/spamassassin')){
@@ -302,6 +333,7 @@
   // 변수 할당
   $mod->tpl->assign( array(PREFS_FILE =>
$web_path."/user/".$user_username."/.user_prefs",
                            SPAM_COMMENT => $spam_comment,
                            SPAM_COMMAND => $spam_command,
                            SPAMASSASSIN_PATH => $spamassassin_path,
                                                    USERNAME =>
$user_username));

이것은 핵심 기능을 추가합니다. 이 변경은 메일 사용자가 생성될 때마다 표준 Maildir 메일박스인 Trash, Sent, Junk 및 Drafts를 추가하여 스팸을 해당 정크 폴더로 이동할 수 있도록 합니다.

다음 파일 전반에 걸쳐 이동 문자열을 찾아 추가합니다:

vi /home/admispconfig/ispconfig/lib/classes/ispconfig_isp_user.lib.php

(약 102번째 줄)

                         $doc->deck[1]->elements[11]->visible = 0;
                  }
                  $doc->deck[2]->elements[2]->values["accept"] =
$go_api->lng("txt_accept");
                  $doc->deck[2]->elements[2]->values["move"] =
$go_api->lng("txt_move");
                  $doc->deck[2]->elements[2]->values["discard"] =
$go_api->lng("txt_discard");
         }
vi /home/admispconfig/ispconfig/web/mailuser/mail/table/user.table.php

(약 135번째 줄)

                                                                   'regex' 
                      => "",
                                                                   'errmsg'
               => "",
                                                                   'value' 
               => array(        "accept" => $app->lng("txt_accept"),
                                                                            
                                             "move"    =>
$app->lng("txt_move"),
                                                                            
                                             "discard" =>
$app->lng("txt_discard"));
 
 $table['spam_hits'] = array('datatype'                 => "VARCHAR",
vi /home/admispconfig/ispconfig/web/mailuser/lib/lang/.lng

(예: en.lng, 약 33번째 줄)

 $wb["txt_accept"] = "accept";
 $wb["txt_move"] = "move";
 $wb["txt_discard"] = "discard";
vi /home/admispconfig/ispconfig/web/isp_manager/lib/lang/.lng

(예: en.lng, 약 268번째 줄 및 452번째 줄)

 $wb["Spamfilter"] = 'Spamfilter';
 $wb["Antivirus"] = 'Antivirus';
 $wb["accept"] = 'accept';
 $wb["move"] = 'move';
 $wb["discard"] = 'discard';
 $wb["Spam Strategie"] = 'Spam Strategy';
 $wb["Spam Hits"] = 'Spam Hits';
(...) 
 $wb["Keine Vorlage verwenden"] = "Individual Settings";
 $wb["Keine Vorlage vorhanden"] = "No Hostingplan Available";
 $wb["txt_accept"] = "accept";
 $wb["txt_move"] = "move";
 $wb["txt_discard"] = "discard";
 $wb["Eigenschaften"] = "Properties";
 $wb["ISP Datenbank"] = "ISP Database";
vi /home/admispconfig/ispconfig/web/isp_kunde/lib/lang/**.lng

(예: en.lng, 약 268번째 줄 및 449번째 줄)

 $wb["Spamfilter"] = 'Spamfilter';
 $wb["Antivirus"] = 'Antivirus';
 $wb["accept"] = 'accept';
 $wb["move"] = 'move';
 $wb["discard"] = 'discard';
 $wb["Spam Strategie"] = 'Spam Strategy';
 $wb["Spam Hits"] = 'Spam Hits';
(...) 
 $wb["Keine Vorlage verwenden"] = "Individual Settings";
 $wb["Keine Vorlage vorhanden"] = "No Hostingplan Available";
 $wb["txt_accept"] = "accept";
 $wb["txt_move"] = "move";
 $wb["txt_discard"] = "discard";
 $wb["Eigenschaften"] = "Properties";
 $wb["ISP Datenbank"] = "ISP Database";

마지막 세 가지 변경 사항은 언어 파일마다 수행해야 하며, 그렇지 않으면 인터페이스에서 해당 언어의 용어 대신 move만 표시됩니다. 세 가지 예제 스니펫은 해당 디렉토리의 en.lng 파일에서 가져온 것이며, 다른 언어도 같은 방식으로 편집합니다(다른 항목 사이에 move 항목을 삽입).

3단계 - 사용자 정의 템플릿 생성

이제 /root/ispconfig/isp/conf 디렉토리로 이동하여 spamassassin.rc.master의 사용자 정의 복사본을 생성합니다:

cd /root/ispconfig/isp/conf  
cp -pr spamassassin.rc.master ./customized_templates/ cd customized_templates

이제 필요한 변경 사항을 반영하도록 사용자 정의 템플릿을 편집합니다:

# 모든 메일은 스팸으로 태그가 지정됩니다 (예: 설정된 임계값보다 높은 점수)
# "/dev/null"로 이동됩니다.
{SPAM_COMMENT}:0:
{SPAM_COMMENT}* ^X-Spam-Status: Yes
{SPAM_COMMENT}{SPAM_COMMAND}

4단계 (선택 사항) - 쓰레기통 및 스팸 폴더 정리 구현

이는 이미 MuisjeNL에 의해 다음 방법으로 다루어졌습니다: ISPConfig를 사용한 쓰레기 및/또는 정크 폴더의 자동 정리 (Roundcube + Tmpreaper / Tmpwatch 사용)

5단계 (선택 사항) - 사용자 친화성 구현 및 상태 메일 생성

현재 우리는 꽤 해킹된 Perl 코드를 사용하고 있기 때문에 이 부분은 개발 중입니다. 이를 정리하거나 예쁜 스크립트로 전환하려고 합니다.

결론

이제 새로운 move 방법을 사용하기 위해 메일 사용자를 추가하거나 기존 사용자를 변경할 수 있습니다. 하루에 약 100-200개의 스팸 메일을 받는 사용자를 대상으로 테스트했으며 그의 전략을 move로 변경했습니다. Roundcube와 같은 웹 메일러를 사용하거나 IMAP을 통해 메일박스에 연결함으로써 첫 번째 메일이 그의 받은 편지함이 아닌 정크 폴더로 즉시 떨어지는 것을 거의 확인할 수 있었습니다.

실제 운영 서버에서 실행하기 전에 반드시 확인하십시오.
이 튜토리얼은 어떠한 보증도 제공하지 않습니다. 현명하게 테스트하세요!

이것은 HowtoForge에서 저의 첫 번째 방법이므로 (저는 원어민이 아닙니다), 귀하의 필요에 맞게 조정하는 데 문제가 없기를 바랍니다. 훌륭한 소프트웨어인 ISPConfig와 함께 즐거운 시간 되세요!

Jens Groh for SANlutions Ltd.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.