메일 서버를 운영하면, 어떻게 아는지 몰라도 매일 매일 많은 스팸 메일들을 수신하게 된다.

이 스팸 메일들을 차단하기 위해 스팸 서버를 별도로 구축하기도 하지만, 메일 서버에 스팸 필터를 설치하여 구현할 수도 있다.

앞서서 SpamAssassin을 이용하여 스팸 서버를 구축하는 것을 정리하였고

여기에서는 SpamAssassin을 Apache James 메일 서버의 스팸 필터로 사용하는 2 가지 방법을 정리한다.

메일 관련 내용들

1. 메일 서버 구축: Apache James

2. 스팸 메일 서버 구축: Postfix & Apache SpamAssassin

3. 메일 서버와 스팸 필터: Apache James & SpamAssassin

 

먼저, SpamAssassin을 다음 명령어로 설치한다.

사용하는 리눅스에 따라서 설치하는 명령어만 다를 뿐 나머지는 동일하다 (CentOS를 기준).

        CentOS > sudo yum install spamassassin

        Ubuntu > sudo apt-get install spamassassin

좀 더 상세한 설치는 스팸 서버 구축에 정리한 인터넷 자료를(url) 참고 하면 된다.

SpamAssassin을 설치하고, SpamAssassin 설정(local.cf) 파일을 다음과 같이 수정한다.

        CentOS > vi /etc/mail/spamassassin/local.cf

        Ubuntu > vi /etc/spamassassin/local.cf

required_hits 2
report_safe 0
rewrite_header Subject [SPAM]

SpamAssassin은 지정되거나 학습된 규칙에 의해서 메일을 평가해서 점수로 환산하고, 지정된 값(required_hits) 이상이면 스팸으로 표시한다.

위 설정외에도 다양한 설정을 할 수 있는데, 설정에 대한 상세한 내용은 이 사이트에 정리된 내용을 참고하면 된다.

기본 값은 5인데, 이렇게 지정되면 테스트하기 어렵기 때문에 2으로 수정한다.

수정내용을 반영하기 위해서 SpamAssassin을 재가동 한다.

         > sudo service spamassassin restart

 

이상으로 SpamAssassin에서 처리할 것은 완료 되었다.

이제부터는 Apache James 에서 Spam 설정을 하고, 메일 테스트를 진행한다.

먼저, James를 설치한 폴더 하위의 conf 파일 중  smtpserver.xml파일을 열어서

SpamAssassinHandler를 사용할 수 있도록 주석으로 처리된(<!--  -->) 부분을 삭제한다.

         > vi conf/smtpserver.xml

<!--
<handler class="org.apache.james.smtpserver.fastfail.SpamAssassinHandler">
    <spamdHost>127.0.0.1</spamdHost>
    <spamdPort>783</spamdPort>
    <spamdRejectionHits>2</spamdRejectionHits>
</handler>
 -->

SpamAssassin은 지정되거나 학습된 규칙에 의해서 메일을 평가해서 점수로 환산한다.

Apache James가 수신한 메일을 SpamAssassin에 넘기고, SpamAssassin이 평가한 점수를 반환 받아서 spamdRejectionHits 값으로 지정한 값 이상이면 메일을 수신하지 않고 돌려 보낸다.

spamdRejectionHits의 기본 값은 10으로 되어 있는데, 값이 너무 높으면 테스트를 할 수 없기 때문에 2로 수정해서 테스트 한다.

수정한 내용을 반영하기 위해서 Apache James를 제가동 한다.

         > sudo bin/james restart

로그를 확인해서 제임스 재가동 완료 여부를 확인한다 (10여초 이상이 걸린다).

         > tail -f log/wrapper.log

메일을 주고 받기 위해 앞서 생성한 생성한 계정(gujc1)외에 하나 더 생성(gujc2)하거나

생성한 하나의 계정으로 메일을 주고 받도록한다.

여기서는 썬더버드(Thunderbird)를 사용할 예정인데,

아웃룩등의 MUA을 실행해서 생성한 메일 계정을 등록하고 다음과 같이 메일을 발송한다.

메일 본문에 dear winner를 입력하고 메일을 발송한다.

다음과 같이 오류가 발생하는 것을 확인할 수 있다.

지금 보내려는 메시지는 스팸인 것 같으니, 스팸이 아니라면 관리자에게 연락하라는 메시지가 나타난다.

dear winner는 스팸 발송자들이 많이 사용하는 단어로

이 단어가 메일 본문에 있으면 SpamAssassin가 스팸으로 판단해서 Apache James에게 알려주고

Apache James가 위와 같이 수신 거부를 하게 된다.

dear winner 같은 스팸 단어와 관련된 자세한 내용은 스팸 서버 구축에 정리된 내용을 참고하면 된다.

 

앞서서 smtpserver.xml파일에서 수정했던 SpamAssassin 설정 부분을 다시 주석처리하고

Apache James를 재가동하고 메일을 보내면 다음과 같이 메일이 잘 송신되고 수신되는 것을 볼 수 있다.

 

이 방식은 수신된 메일이 확실하게 스팸 메일(spamdRejectionHits 이 10 이상- 테스트는 2)이면 되돌려 보내는 것이다.

하지만 수신한 메일이 스팸인지 애매한 경우도 있다.

spamdRejectionHits에 지정된 값 보다 작지만 (즉, 수신되었지만)

앞서 SpamAssassin에서 지정한 required_hits 값보다 큰 메일은 메일 수신자의 스팸 폴더에 넣어주는게 좋다.

(required_hits의 기본값은 5이지만, 앞서서 테스트를 위해 2로 지정했다.)

대부부의 상용 메일 서버들은 스팸으로 의심되는 메일들은 각 개인의 스팸 폴더에 넣어주고,

개인이 판단하도록 하기 때문에 여기에서도 이 방식을 구현한다.

 

앞서서 smtpserver.xml파일에서 수정했던 SpamAssassin 설정 부분을 다시 주석처리하거나

spamdRejectionHits 값을 10 이상으로 수정해서 스팸 메일을 반환하지 않도록 한다.

 

스팸 폴더에 메일을 저장하기 위해, conf 폴더에 있는 mailetcontainer.xml 파일에 다음 설정을 추가한다.

         > vi conf/mailetcontainer.xml 

생략 ~~
<processor state="root" enableJmx="true">
생략 ~~
       <mailet match="SMTPAuthSuccessful" class="ToProcessor">
          <processor>transport</processor>
       </mailet>

       <mailet match="All" class="SpamAssassin">
           <spamdHost>localhost</spamdHost>
           <spamdPort>783</spamdPort>
       </mailet>
       <mailet match="HasHeader=org.apache.james.spamassassin.flag=YES" class="ToProcessor">
           <processor>spam</processor>
       </mailet>

mailetcontainer.xml는 메일을 처리하는 주요 과정을 설정하는 파일로,

메일을 수신하면 SpamAssassin클래스를 실행해서 스팸 확인을 하도록 추가하였다.

match 문은(Macher) 일종의 if문을 의미하는데,

위 코드에서는 모든 메일(All)은 SpamAssassin에 접속해서 스팸 여부를 확인하는 SpamAssassin클래스를 거치도록 하였다.

SpamAssassin클래스에서는 스팸 여부를 확인후 org.apache.james.spamassassin.flag헤더를 추가하고 YES / NO 값을 지정한다.

다음 match에서는 검사후 org.apache.james.spamassassin.flag헤더의 값이 YES이면

spam처리를 하는 spam프로세스(<processor>spam</processor>)로 이동한다.

주의: 인터넷 검색 자료(공식자료?)에서는 HasMailAttributeWithValue=org.apache.james.spamassassin.flag,YES를 사용하도록 되어 있다.
HasMailAttributeWithValue는 속성값을 확인하는 것인데, 이유는 모르지만 제대로 작동하지 않는다.
여기에서는 헤더 값을 확인하는 HasHeader를 사용했다.
상세한 설명은 Apache James Macher 문서에 정리되어 있다.

 

mailetcontainer.xml 하단에 다음과 같이 spam프로세스를 처리하는 부분이 있다.

<processor state="spam" enableJmx="true">
   <!-- To place the spam messages in the user junk folder, uncomment this matcher/mailet configuration -->
   <!--
   <mailet match="RecipientIsLocal" class="ToRecipientFolder">
        <folder>Junk</folder>
        <consume>false</consume>
   </mailet>
   -->

   <mailet match="All" class="ToRepository">
        <repositoryPath>file://var/mail/spam/</repositoryPath>
   </mailet>
</processor>
   

스팸으로 확인된 메일은 지정된 경로(repositoryPath)에 저장하도록 되어 있다.

이 Matcher를 삭제하고, 그 위에 주석으로(<!--  -->) 작성된 코드에서 주석을 제거한다.

<processor state="spam" enableJmx="true">
   <!-- To place the spam messages in the user junk folder, uncomment this matcher/mailet configuration -->
   <mailet match="RecipientIsLocal" class="ToRecipientFolder">
        <folder>Junk</folder>
        <consume>false</consume>
   </mailet>
</processor>
   

수신자(Recipient)가 Apache James에 등록된(local) 사용자면 (RecipientIsLocal)

수신자 저장 클래스를(ToRecipientFolder) 실행해서 스팸(Junk) 폴더에 저장하도록 한다.

스팸으로 지정되면, 한 폴더에 모으는 것이 아니고 각 개인의 스팸 폴더에 저장해서 개인이 볼 수 있도록 설정했다.

 

마지막 설정으로 수신한 스팸을 저장할 개인별 Junk 폴더를(메일함) 생성한다.

           james-cli.sh CreateMailbox private 이메일주소 Junk

 

Apache James를 재가동하고,

선더버드와 같은 MUA에서 다음과 같이 스팸 메일을 발송한다.

그림과 같이 [스팸 편지함]에 메일이 제대로 저장 되는 것을 볼 수 있다.

수신한 메일을 선택하고 그림 우측 중앙에 있는 [기타]를 선택해서, [소스보기]를 실행한다.

다음과 같이 수신한 메일의 EML 원문 내용을 볼 수 있는데, 메일 헤더에 스팸 메일로 표시되어 있다.

org.apache.james.spamassassin.flag가 YES이고, 스팸 점수가 2.9점으로 표시되었다.

위 그림과 같이 [스팸 편지함]이 보이지 않는 경우,

썬더보드의 경우 해당 메일 계정을 선택하고 마우스 오른쪽 버튼을 눌러서 [설정] 메뉴를 실행한다.

계정 설정 화면 하단에 있는 [새 스팸 메시지 이동]을 선택하고, 편지함 탭을 선택하면 [스팸 편지함]을 볼 수 있다.

이상으로 SpamAssassin을 Apache James 의 스팸 필터로 사용하는 방법을 정리하였다.

SpamAssassin을 스팸 서버로 사용하는 방법도 정리하였는데,

SpamAssassin을 스팸 서버로 사용하는 경우,

스팸 메일이면 메일헤더에 X-Spam-Flag가 추가되고 YES값이 추가된다(참고).

앞서 mailetcontainer.xml 에서 설정한 스팸 필터 연동 부분을 삭제하고 (<mailet match="All" class="SpamAssassin">)

스팸 여부를 확인하는 HasHeader=org.apache.james.spamassassin.flag=YES 대신에

HasHeader=X-Spam-Flag=YES을 지정하면 스팸서버에서 판단한 스팸 메일을 각 개인의 스팸 메일함(Junk)에 저장할 수 있다.

 

덧붙이는 글

한글 스팸 메일들을 SpamAssassin으로 학습시켜서 스팸 메일을 테스트하는 내용에 대해서 공유할 계획입니다.

자신의 메일 함에 있는, 또는 회사 스팸 서버에 있는 스팸 메일들을 공유해주시면 감사하겠습니다.

net_forest@hanmail.net 으로 보내주세요.

 

 

 

 

 

앞서서 Apache James를 이용하여 메일 서버를 운영하는 방법에 대해서 정리하였다.

이렇게 메일 서버를 운영하면, 어떻게 아는지 몰라도 매일 매일 많은 스팸 메일들을 수신하게 된다.

이 스팸 메일들을 차단하기 위해 스팸 서버를 이용하거나 메일 서버내에 스팸 필터를 적용해서 이용하는데, 여기에서는 오픈 소스인 Apache SpamAssassin를 이용하여 스팸 서버를 구축하는 방법에 대해서 정리한다.

 

메일 관련 내용들

1. 메일 서버 구축 : Apache James

2. 스팸 메일 서버 구축: Postfix & Apache SpamAssassin

3. 메일 서버와 스팸 필터 : Apache James & SpamAssassin

 

구축 방법은 다음과 같이 인터넷 검색으로 쉽게 찾을 수 있기 때문에 여기에서는 정리하지 않고, 스팸 메일 서버를 이용해서 실제로 테스트하는 방법만 정리한다.

스팸 서버 구축에 필요한 SpamAssassin은 리눅스에서 운영되며 여기에서는 Centos 7에 설치하고 정리하였다.

Ubuntu도 설치법은 유사하다.

 

Centos 설치
https://tweenpath.net/configuring-spamassassin-postfix-centos/
https://devopspoints.com/centos-7-installing-and-configuring-spamassassin.html

Ubuntu 설치
https://hostadvice.com/how-to/how-to-secure-postfix-with-spamassassin-on-an-ubuntu-18-04-vps-or-dedicated-server/

스팸 서버도 메일을 주고 받는 서버이기 때문에 메일 서버랑 기본적으로 동일하다.

따라서 인터넷 자료는 Postfix, Dovecot등으로 메일 서버를 구축하고,

SpamAssassin으로 스팸 메일을 체크를 하는 식으로 구현하는 자료가 많은데, 이러한 내용들은 설치만 해도 제법 복잡하다 (이런 구축은 스팸 서버라기 보다 스팸 필터라고 생각한다).

스팸 서버는 메일을 주고 받는 SMTP와 스팸 여부를 확인하는 기능만으도 충분하다.

(각종 메일 처리나 IMAP, POP3등을 구현하지 않는다.)

메일 송수신에 사용되는 SMTP는 Postfix를 이용하고, 송수신하는 메일에 대한 스팸 여부는 SpamAssassin으로 확인하도록 구축한다.

 

Postfix는 운영체제와 같이 설치되어 있고, SpamAssassin만 위 인터넷 자료를 따라서 설치한다 (Ubuntu에서 spamc는 굳이 설치하지 않아도 되는 것 같다).

설치 문서의 핵심은 메일을 발송하는 Postfix와 SpamAssassin을 연결하는 것으로, Postfix에서 메일을 송수신 하면 SpamAssassin으로 검사 하기 위한 것이다.

 

다만, 이 문서에서 SpamAssassin 설정(/etc/mail/spamassassin/local.cf)을 다음과 같이 수정한다 (CentOS).

            > vi /etc/mail/spamassassin/local.cf

required_hits 2
report_safe 0
rewrite_header Subject [SPAM]

SpamAssassin은 지정되거나 학습된 규칙에 의해서 메일을 평가해서 점수로 환산하고, 지정된 값(required_hits) 이상이면 스팸으로 표시한다.

위 설정외에도 다양한 설정을 할 수 있는데, 설정에 대한 상세한 내용은 이 사이트에 정리된 내용을 참고하면 된다.

기본 값은 5인데, 이렇게 지정되면 테스트하기 어렵기 때문에 2으로 수정해서 진행한다.

수정내용을 반영하기 위해서 SpamAssassin을 재가동 한다.

         > sudo service spamassassin restart

 

스팸 메일을 테스트하려면 스팸 메일을 만들어야 한다.

스팸 메일을 만들려면 SpamAssassin의 규칙을 알아야 하는데, 다음 그림과 같이 Futurequest 사이트에 잘 정리되어 있다.

위 내용들은 메일이 어떤 내용을 가지고 있는 냐에 따라 점수를 부여하는지를 나타낸 것으로

특정 메일이 위 사항을 위반했는지 확인해서 점수들을 부여하고, 이 점수들을 합산하여 스팸으로 평가한다.

위 리스트 중에 메일 본문에 "dear winner"란 글자가 있으면 3.099의 점수를 부여 받는다는 것을 알 수 있다.

앞서 SpamAssassin 설정에서 기준 점수를 2점으로 지정했으니 "dear winner"를 입력하면 스팸 메일로 처리할 수 있다.

 

이 문장을 포함한 메일을 메일서버나 스팸 서버에서 수신하도록 하면 되는데, 도메인을 등록하고 MX 레코드등을 지정하지 않으면 메일을 수신할 수 없다.

이 문제 때문에 스팸 서버 설치만 있고 테스트가 없는 것 같은데,

여기에서는 스팸 서버로 수신하는 것이 아니고, 송신하는 방식으로 테스트 한다.

스팸 서버는 송신을 하던 수신을 하던, 스팸 여부를 확인하기 때문이다.

그리고, Apache James에서 정리한 것과 같이 메일을  송신하는 것은 별도의 도메인이나 MX 레코드등을 지정하지 않아도 가능하기 때문이다.

 

Postfix와 SpamAssassin이 잘 실행되었으면 (스팸 서버가 구축되었으면), 실제로 메일을 보내기 위해 텔넷으로 이 스팸(?)서버에 접속한다.

        > telnet localhost 25

Postfix등 메일 서버는 기본적으로 25번 포트를 사용한다.

 

텔넷 접속후 다음 내용을 순서데로 입력한다.

ehlo aaa
mail from:<gujc1@forest71.com>
rcpt to:<gujc~~~@gmail.com>
data
subject:dear winner

dear winner

.

ehlo는 메일을 보내겠다고 Postfix에 알리는 것으로 아무 값(aaa)이나 지정하면 된다.

메일을 보내는 사람(from)과 받는 사람(to)을 입력한다.

보내는 사람은(from) 아무 값이나 입력해도 되다.

아무 값이나 입력해도 되기 때문에 스팸 발송자들이 다양하게(?) 활용한다.

받는 사람은(to) 메일을 받아야 하기 때문에 실제 사용하는 계정을 지정한다.

data를 지정하고 엔터키를 치면 메일 제목(subject)과 본문을 입력할 수 있다.

제목(subject)을 입력한 뒤에는 빈 라인 하나를 입력해야 제목(subject)으로 인식된다.

그렇지 않으면 본문으로 처리되어 제목없는 메일이 발송된다.

본문까지 입력한 뒤에는 점(.)을 입력하고 엔터키를 쳐서 다음과 같이 메일을 발송한다.

 

여기에서는 gmail로 메일을 보냈으니 gmail에 접속해서 보낸 메일을 확인한다.

대부분 스팸 메일함에 있을 텐데, SpamAssassin 때문이 아니고, 구글의 스팸 서버가 그렇게 처리한 것이다.

위 그림과 같이 메일 제목에 [SPAM]이 붙은 것을 볼 수 있다.

일반적인 문장으로 보내면 [SPAM]이라는 문자열이 없다.

위 메일은 메일을 보낼때 SpamAssassin이 스팸으로 판단해서 메일 제목에 붙인 것으로, 앞서 설정한 SpamAssassin  설정에서 지정한 문자열이다.

 

그림 우측의 메뉴(점 3개)를 클릭해서 [원본보기]를 선택한다.

메일 보기 화면은 필요한 사항만 추출하여 잘 정리하여 보여주는 것이고, 실제 수신해서 저장한 EML 메일 내용은 다음과 같이 다양한 정보들을 포함하고 있다.

실행된 별창에서 스크롤을 내리면 다음과 같이  X-Spam~~으로 시작하는 메일 헤더들을 볼 수 있다.

생략 ~~~
Received: by localhost.localdomain (Postfix, from userid 1001) id 30AEC811148; Sat,
  9 Jan 2021 15:44:19 +0900 (KST)
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on localhost.localdomain
X-Spam-Flag: YES
X-Spam-Level: ****
X-Spam-Status: Yes, score=4.5 required=2.0 tests=ALL_TRUSTED,DEAR_WINNER, DKIM_ADSP_NXDOMAIN,MISSING_HEADERS,NO_DNS_FOR_FROM,TVD_SPACE_RATIO autolearn=no autolearn_force=no version=3.4.0
X-Spam-Report: * -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP *
  0.8 DKIM_ADSP_NXDOMAIN No valid author signature and domain not in DNS *
  1.2 MISSING_HEADERS Missing To: header *
  3.1 DEAR_WINNER BODY: Spam with generic salutation of "dear winner" *
  0.4 NO_DNS_FOR_FROM DNS: Envelope sender has no MX or A DNS records *
  0.0 TVD_SPACE_RATIO No description available.
Received: from aaa (localhost [IPv6:::1]) by localhost.localdomain (Postfix) with ESMTP id 3DA12811149 for <gujc71@gmail.com>; Sat,
  9 Jan 2021 15:43:30 +0900 (KST)
subject: [SPAM] dear winner
Message-Id: <20210109064341.3DA12811149@localhost.localdomain>

메일을 발송하기 전에 SpamAssassin이  처리한 결과를 메일 헤더에 저장한 것으로

X-Spam-Status에 기준값이(required) 2인데, 이 메일은 4.5 (score)이기 때문에 스팸(yes)이라고 저장되어 있다.

X-Spam-Report에는 어떻게 4.5점이 되었는지 이유가 정리되어 있다.

다른 이유도 있지만 "dear winner"가 3.1점으로 가장 큰 이유가 되었다.

 

이상으로 스팸 서버를 구축해서 테스트 하는 방법을 정리하였다.

메일을 수신하지 못하기 때문에 발신으로 테스트 하였지만, 실제 스팸 서버를 구축하고 수신으로 처리하여도 동일한 결과를 얻을 수 있다.

실제로 스팸 서버로 사용하기 위해 빠진 내용은 스팸 서버가 메일을 받아서 스팸 여부를 확인하고 나면 확인한 메일을 실제 메일서버로 전달(relay)한다.

또, 실제 메일 서버에서는 메일의 헤더를 확인하고 스팸이면 삭제하거나 해당 수신자의 스팸 메일함에 넣게 된다.

도메인 관련 설정도 필요하고 메일 서버도 정리해야 하기 때문에 메일서버로 전달(relay)하는 기능은 여기서 정리하지 않았고,

스팸 메일함에 저장하는 방법은 SpamAssassin을 스팸 필터로 사용하는 방법을 정리하는 부분에서 조금 정리하였다.


추가적으로 정리하지 못한 내용은 [한글] 메일에 대한 스팸 처리이다.

SpamAssassin은 베이지안(Bayesian) 알고리즘으로 스팸 메일을 학습해서 성능을 향상시킬 수 있다.

영어 메일은 학습해서 기본적인 규칙을 만들어 가지고 있지만, 한글에 대한 규칙은 제공되는 것이 없다 (못 찾은 것일 수도 있다).

한글 스팸 규칙을 만들기 위해서는 한글 스팸 메일들을 학습시켜야 하는데, 제법 많은 메일이 필요해서 테스트를 하지 못했다.

 

덧붙이는 글

한글 스팸 메일들을 SpamAssassin으로 학습시켜서 스팸 메일을 테스트하는 내용에 대해서 공유할 계획입니다.

자신의 메일 함에 있는, 또는 회사 스팸 서버에 있는 스팸 메일들을 공유해주시면 감사하겠습니다.

net_forest@hanmail.net 으로 보내주세요.

 

 

Apache James 메일 서버는 Java로 만든 메일 서버로

다양한 오픈 소스 메일 서버 중에서 최고의 메일 서버인지는 확인되지 않지만, 안정적인 기능과 Apache의 지원을 받는 메일 서버이다.

다만 문서나 자료가 많지 않아서, 알게 되는 것들을 기록차원에서 다음과 같이 나누어 정리한다.

 

  1. Apache James 메일 서버 - 설치
  2. Apache James 메일 서버 - 설정
  3. Apache James 메일 서버 - 메일 클라이언트
  4. Apache James 메일 서버 - Text와 JPA(MariaDB등)
  5. Apache James 메일 서버 - 스팸 필터 (SpamAssassin)

 

Apache James 메일 서버(이하 James)를 사용해 보기 전에

SMTP(Simple Mail Transfer Protocol), IMAP(Internet Message Access Protocol) 등의 개념에 대해서는 검색해 보거나 다음 자료들을 읽어보는 것이 좋다.


        https://wodonggun.github.io/wodonggun.github.io/study/SMTP,-POP3,-IMAP-%EC%9D%B4%EB%9E%80.html
        https://m.post.naver.com/viewer/postView.nhn?volumeNo=26957131&memberNo=2521903

James의 공식 사이트는 다음과 같이 그럴 듯 해 보이는데, 메뉴를 클릭하면 심플한 구조에 간단한 설명들만 있다.

상세한 자료는 커뮤니티 사이트의 내용을 참조해야 한다.


James 설치 방법은 다음 URL에 정리되어 있지만, 상세하게 설명되어 있지 않다.

(아는 사람에게는 간단 명료한 설치 문서가 될 것 같다.)

            https://james.apache.org/server/quick-start.html
            https://james.apache.org/server/install.html

 

여기에서는 이 내용을 토대로 윈도우(10)에서 설치하는 방법을 중심으로 정리한다.

리눅스에 설치하는 방법은 위 URL 내용대로 하면 되지만, 윈도우는 조금 더 설치가 어렵기(?) 때문이다.

Java 설치 방법은 여기에서 정리하지 않는다.

JDK 1.8 이상을 설치해야 하고, JAVA_HOME과 bin 폴더에 대한 Path는 지정되어 있어야 한다.

 

먼저, 다운로드 사이트에서 apache-james-3.5.0-app.zip 파일을 다운받는다.

오픈 소스이기 때문에 소스를 받아서 (할 수 있다면) 수정해서 사용할 수도 있다.

(도전 중인데, 설치가 쉽지 않다. 실력향상을 위해 도전해 보는 것도 좋을 것 같다.)

여기에서는 Binary 파일인 apache-james-3.5.0-app.zip을 받아서 실행한다.

적당한 폴더에 압축을 풀면, 다음과 같은 폴더 구조를 볼 수 있다.

bin 폴더에는 James를 실행하는 파일이 있고,

conf 폴더에는 James 설정 파일들이 있다.

lib 폴더는 James 실행에 필요한 Java 라이브러리들이 있고,

log 폴더는 실행 결과에 대한 다양한 정보를 제공하는 로그 파일들이 있다.

var 폴더에는 activemq, 메일 오류 파일 등이 저장되어 있다.

 

conf 폴더에는 20 여개의 설정 파일들이 있다.

James는 다양한 기능을 제공하는데, 이 설정 파일들을 이용하여 조절할 수 있다.

설정에 대한 간략한 웹 페이지가 있지만 설명이 많지 않고, 각 설정 파일 안에 간단한 설명이 주석으로 포함되어 있다.

설정과 관련된 주요한 몇 가지 내용은 별도로 정리한다.

여기에서는 James를 실행하기 위한 설명 몇 가지만 지정한다.

 

domainlist.xml 파일에서 사용할 도메인(forest71.com)을 지정한다.

이 도메인은 실제 등록된 도메인을 지정해도 되고, 테스트를 위해서 여기서는 forest71.com을 사용한다.

사용할 도메인을 지정하고 James를 실행하면 되지만,

mailetcontainer.xml에서 우편 관리자 계정에 대한 도메인도 위와 같이 동일하게 지정한다.

우편 관리자 계정은 반송 메일 등에 사용된다.

James는 Java로 제작되었기 때문에 다운로드 받은 zip 파일 하나로 윈도우와 리눅스에서 실행할 수 있다.

다만, James가 여러 가지 이유로 갑자기 종료 되었거나 멈춰진 상태로 있을 경우, 자동으로 감지하여 재시작하기 위해 Wrapper를 사용하여 제작되었다.

(기업에서 메일 서버는 중지되면 안 된다.)

이 Wrapper가 윈도우에서는 윈도우 서비스로 등록해서 사용하고, 리눅스에서는 쉘(Shell)로 백그라운드에서 실행한다.

 

윈도우 시작 메뉴를 눌러 cmd 를 입력해서 콘솔(cmd) 창을 관리자 권한으로 실행한다.

리눅스도 root 권한으로 실행해야 한다.

(메일 서버는 25와 143포트(port)를 사용하는데 1024보다 작은 포트는 관리자 권한으로만 실행 할 수 있다.)

 

콘솔 창에서 James 압축을 해제한 폴더 중 bin 폴더로 이동하여 james.bat install 를 실행한다.

이것은 James를 윈도우 서비스로 등록하는 명령어로, 다음과 같이 서비스가 등록된다.

james.bat remove로 제거 할 수 있다.

윈도우 서비스 창에서 실행 버튼을 눌러 실행해도 되고, 콘솔 창에서 james.bat start로 실행해도 된다.

start외에 stop이나 restart 로 James를 중지하거나 재시작할 수 있다.

리눅스에서는 james.bat 대신에 ./james.sh를 실행하면 되고, 위와 같이 서비스에 등록하는 과정없이 실행하면 된다.

윈도우는 관리자 권한으로 콘솔(cmd) 창을 실행했지만,

리눅스는 root 계정으로 로그인해서 실행하거나 다음과 같이 sudo를 이용해서 실행해야 한다.

           sudo ./james.sh start

James를 실행하는 윈도우와 리눅스의 차이는 이 정도가 있다.

 

log폴더에 다양한 로그 파일들이 생성되는데, wrapper.log 파일에 각 로그의 내용이 포함되어 생성된다.

wrapper.log파일을 적절한 편집기로 열어서 다음과 같이 잘 시작되었는지 확인한다.

리눅스는 less log/wrapper.log 나 tail -f log/wrapper.log로 확인한다.

 

주의: wrapper.log에 위와 같은 실행 결과가 아닌, 다음과 같은 오류를 볼 수 있다.

     Unable to start JVM: No such file or directory (2)
     JVM exited while loading the application.

이것은 JAVA_HOME 이나 PATH 설정이 제대로 지정되지 않아서 생기는 오류로 JAVA_HOME 이나 PATH 설정을 확인한다.
콘솔 창에서 java를 실행하면 사용법이 출력되어야 제대로 설치된 것이다.

계속 이렇게 오류가 발생할 경우 conf폴더의 wrapper.conf 파일에서 다음과 같이 java가 설치된 경로(bin폴더 포함)를 지정하면 된다.

# Java Application
wrapper.java.command=(자바경로지정)java
wrapper.working.dir=.

 

또는 콘솔 창에서 다음 명령어로 SMTP (25), POP3 (110), IMAP (143) 포트가 보이면 잘 실행된 것이다.

    윈도우 : netstat -anq | findstr LISTEN
    리눅스 : netstat -anp | grep LISTEN

James가 제대로 실행되었으면,

다음 명령어로 앞서 지정한 도메인을 제임스에 등록하고, ListDomains으로 확인한다 (다음 주의사항 확인).

    윈도우: james-cli.bat adddomain forest71.com
    리눅스: ./james-cli.sh AddDomain forest71.com

주의
James 설치 문서에서는 위와 같이 실행하라고 하는데,
domainlist.xml 파일에서 사용할 도메인(forest71.com)을 지정했기 때문에 추가하지 않아도 된다.

다음 명령어로(adduser) 메일 사용자(계정@도메인)을 생성하고 ListUsers로 확인한다.

    james-cli AddUser gujc1@forest71.com gujc1234

이상으로 James 설치 방법을 윈도우 중심으로 정리하였다.

윈도우나 리눅스나 기본적인 설치 / 사용 방법은 동일하다.

윈도우는 윈도우 서비스에 등록해서(james install) 사용하는 차이만 있다.

(굳이 추가하면 bat를 사용하느냐? sh을 사용하느냐의 차이도 있다.)

 

주의: 리눅스(Linux)에는 기본적으로 Postfix나 Sendmail이 설치된 경우가 있다.

설치전에 netstat 로 25번 포트를 사용하는 프로그램이 있는지 확인할 수 있다.

설치된 경우에는 James를 실행할때, wrapper.log에 포트 중복 오류가 발생한다.

 

James 설치 방법을 한마디로 정리하면, James 메일 도메인과 메일 사용자를 등록해서 실행하는 것이다.

기본적인 설정만으로도 내부 메일은 문제없이 사용할 수 있다.

 

이제 메일을 보내고 받으면 되는데, 메일을 송수신하는 방법과 좀더 상세한 설정은 다른 페이지에 정리하였다.


 

+ Recent posts