앞서서 James의 conf 폴더에 있는 여러 설정 파일 중에서 domainlist.xml, mailetcontainer.xml에서 도메인을(forest71.com) 수정해서 실행하였다.

여기에서는 몇 가지(알고 있는 or 중요한) 설정에 대해서 정리한다.

 

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

 

먼저 확인할 설정 파일은

메일을 보낼 때 사용하는 프로토콜인 SMTP (smtpserver.xml),

수신한 메일을 확인하기 위해 사용하는 프로토콜인 IMAP (imapserver.xml) 이다.

POP3 (pop3server.xml) 프로토콜도 있지만 과거에 많이 사용하던 것으로, IMAP 사용이 권장되고 설정 방법도 비슷해서 여기에서는 정리하지 않는다.


SMTP와 관련해서 설정하는 smtpserver.xml의 내용은(주석 제거) 다음과 같다.

<smtpservers>
   <smtpserver enabled="true">

     <jmxName>smtpserver</jmxName>
     <bind>0.0.0.0:25</bind>
     <connectionBacklog>200</connectionBacklog>

     <tls socketTLS="false" startTLS="false">
       <keystore>file://conf/keystore</keystore>
       <secret>yoursecret</secret>
       <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider>
       <algorithm>SunX509</algorithm>
     </tls>
        <connectiontimeout>360</connectiontimeout>
        <connectionLimit>0</connectionLimit>
        <connectionLimitPerIP>0</connectionLimitPerIP>
        <authorizedAddresses>127.0.0.0/8</authorizedAddresses>
        <maxmessagesize>0</maxmessagesize>
        <addressBracketsEnforcement>true</addressBracketsEnforcement>
        <handlerchain>
            <handler class="org.apache.james.smtpserver.fastfail.ValidRcptHandler"/>
            <handler class="org.apache.james.smtpserver.CoreCmdHandlerLoader"/>       
        </handlerchain>           
   </smtpserver>
</smtpservers>

smtpserver.xml

<smtpserver>속성 enabled값이 true면 SMTP를 사용하는 것이고, false이면 사용하지 않는다 (메일을 보내고 받을  수 없다).

<bind>의 25는 사용할 포트를 지정하는 것으로, SMTP는 25번 외에 465, 587번 포트를 사용할 수 있다.

이 포트는 <tls>에서 어떤 인증 방식을 사용하는지에 따라 결정한다.

25번은 일반적인 통신에(socketTLS="false" startTLS="false") 많이 사용하고,

465, 587번은 SSL(Secure Sockets Layer)이나 TLS(Transport Layer Security)를 사용할 때 지정한다.

위의 포트 번호를 바꿔도 돼고, smtpserver 속성(smtpservers내에 있는) 전체를 복사해서 하나 더 만들어도 된다.

2개이상을 사용할 경우에는 <jmxName>의 이름을 다르게 부여해야 한다.

25번 포트의 <jmxName>는 smtpserver이니, 다른 포트는 smtpserver_ssl 등의 이름으로 지정한다.

이외에 <keystore> 속성에 인증서 파일이나 JKS 파일을 지정하고, <secret> 속성에 비밀번호를 지정해서 인증서(SSL, TLS)를 사용한다.

 

마지막으로 <authorizedAddresses> 속성은 인증 주소를 의미한다.

SMTP, IMAP등은 원격에서 메일 서버에 접속하는 것으로 아이디와 비번을 이용하여 로그인을 해야한다.

<authorizedAddresses>는 이러한 로그인을 하지 않아도 되는 IP주소를 의미한다.

주로, 그룹웨어나 ERP등의 시스템에서 알림 메일등을 발송할때 해당 시스템 서버의 IP를 지정해서 로그인없이 메일을 발송할때 유용하다.

 

이외에도 다양한 설정이 있고, 주석으로 작성되어 있지만 스팸 차단 프로그램과 연동하는 SpamAssassinHandler나 스팸 발송 업체들(IP)를 차단하는 URIRBLHandler등의 기능도 있다.

 

IMAP을 설정하는 imapserver.xml에서는 다음과 같이 사용할 포트를 지정하고, 인증서(SSL, TLS)를 사용할지 결정한다.

<imapservers>
    <imapserver enabled="true">
       <jmxName>imapserver</jmxName>
       <bind>0.0.0.0:143</bind>
       <connectionBacklog>200</connectionBacklog>
       <tls socketTLS="false" startTLS="false">
         <keystore>file://conf/keystore</keystore>
         <secret>yoursecret</secret>
         <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider>
       </tls>
       <connectionLimit>0</connectionLimit>
       <connectionLimitPerIP>0</connectionLimitPerIP>
    </imapserver>
</imapservers>

imapserver.xml

 

SMTP와 사용법은 동일하고 사용하는 포트만 143으로 차이가 있다.

인증서(SSL, TLS)를 사용할 경우에는 993 포트를 사용하고,  SMTP와 같이 2개의 포트를 지정할 수 있다.

 

SMTP, IMAP과 SSL(TLS)에 대한 정리

아웃룩, 썬더버드등의 메일 클라이언트 프로그램을 MUA(Mail User Agent)이라고 한다.
이런 프로그램을 이용하여 메일 작성하면 SMTP를 이용하여 메일 서버로 보내고,
해당 메일서버는 다른 메일 서버로 SMTP를 이용하여 메일을 발송한다(Mail Transfer Agent - MTA).
메일 전송은 모두 SMTP 프로토콜이다 (많은 사람이 혼동했다).
메일 서버에서 수신한 메일을 가지고 오는 것은 IMAP/POP3 프로토콜이다.



여기에 별도로 정리하는 것은 인증서 사용에 대해서 혼동하는 경우가 많기 때문으로,

당연이 IMAP/POP3 에서 인증서를 지정하면, 서버에서 메일을 가지고 올때 지정된 인증서로 암호화 해서 가지고 온다.
그리고, SMTP에 인증서를 지정하면, 지정된 인증서로 메일을 암호화해서 메일 서버로 전송한다.
하지만, 이 메일을 다른 메일 서버로 보낼 때에는 상대 서버에 지정된 인증서를 사용한다.
당연한 개념인데, 자신의 메일 서버에 지정된 인증서로 암호화해서 보내는 것이 아니고
상대 서버의 인증서로 암호화해서 상대 서버로 보내게 된다.
자신의 서버에 인증서를 지정하지 않아도 보안 메일을 보낼 수 있는데,
자신의 서버에 인증서를 설치하지 않아서 보안 메일을 사용하지 않는 경우가 있다 (누군가의 경험).

이 내용은 다음의 mailetcontainer.xml 정리에서 gmail을 대상으로한 예제에서 확인할 수 있다.

 

다음은 James에서 가장 중요하고(?) 복잡한 mailetcontainer.xml파일이다.

James가 메일을 처리하는 과정을 통제하는 부분으로 플러그인을 개발해서 부족한 기능을 구현할 수 있다.

기업에서 많이 사용하는 자동 포워딩이나 자동 분류 등의 다양한 부가 기능을 구현할 수 있는데,

여기에서 정리할 수 없고 아직 분석(?) 중에 있다.

간단하게 정리하면 processor와 match가 중심인데, processor는 여러가지 처리 단계를 의미하고, match는 일종의 if문을 의미한다.

즉, 메일이 어떤 조건에 맞으면 (match) 특정한 일을(class) 하거나 특정한 processor로 이동하도록 한다(ToProcessor).

class에는 실제 Java 클래스를 지정해서 원하는 일을 하도록 한다.

여러가지 조건들은 Apach James 문서를 참고하면 된다.

 

다만, 여기서는 몇 가지 사항만 정리한다.

먼저, 다음 match를 제거해야 외부로 메일을 보낼 수 있다.

<mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor">
  <processor>relay-denied</processor>
  <notice>550 - Requested action not taken: relaying denied</notice>
</mailet>

mailetcontainer.xml

내부(LocalDelivery)는 현재 James 메일 서버에 등록된 도메인의 계정끼리 메일을 주고 받는 것을 의미하고,

외부(RemoteDelivery)는 Gmail등의 다른 메일서버로 메일을 보내는 것을 의미한다.

외부주소가 127.0.0.1이 아니면 relay-denied라는 processor로 보내서 메일을 발송하지 않고 종료한다.

 

이 match를 제거하고, 구글 gmail로 메일을 발송하면 다음과 같이 잘 발송되는 것을 확인할 수 있다.

[받은 편지함]에 메일이 없다면 [스팸 메일함]에 있을 것이다 (이유는 다양).

수신한 메일에서 [나에게] 옆에 빨간색 아이콘을 클릭하면 다음과 같은 그림을 볼 수 있다.

[암호화 기능 사용하지 않음]이라고 표시되는데, 메일을 암호화하지 않고 평문 메일로 받았다는 것이다.

 

다음과 같이 RemoteDelivery에 startTLS 속성을 추가하고, James를 재가동한 후에 메일을 보낸다.

  <mailet match="All" class="RemoteDelivery">
          <outgoing>outgoing</outgoing>

          <startTLS>true</startTLS>

mailetcontainer.xml

다음과 같이 안전한 메일로 표시되는 것을 볼 수 있다.

이렇게 암호화된 메일을 주고 받는 경우, 수신 서버가 개발자 SSL등 개발 인증서를 사용하여 설치한 경우에는(상용 인증서) 메일을 수신할 수 없다.

다음과 같이 RemoteDelivery 클래스의 설정에 mail.smtp.ssl.trust를 추가해서 사용한다.

  <mailet match="All" class="RemoteDelivery">
          <outgoing>outgoing</outgoing>

          <startTLS>true</startTLS>
          <mail.smtp.ssl.trust>*</mail.smtp.ssl.trust>

mailetcontainer.xml

RemoteDelivery에는 다양한 속성이 있으니, James 문서를 참고해서 익혀 두는 것이 좋다.

 

이 외에도 mailetcontainer.xml 파일에는 메일과 관련된 다양한 처리를 설정할 수 있다.

다양한 기능들이 주석으로 처리되어 사용자가 선택해서 사용할 수 있다.

예로, 다음 설정은 첨부 파일의 확장자를 확인해서 제한하는 기능으로 주석을(<!-- -->) 해제하면 사용할 수 있다.

<!-- Check attachment extensions for possible viruses -->
<!-- The "-z" option requests the check to be non-recursively applied -->
<!-- to the contents of any attached '*.zip' file. -->
<!--
<mailet match="AttachmentFileNameIs=-d -z *.exe *.com *.bat *.cmd *.pif *.scr *.vbs *.avi *.mp3 *.mpeg *.shs" class="Bounce" onMatchException="error">
  <inline>heads</inline>
  <attachment>none</attachment>
  <passThrough>false</passThrough>
  <prefix>[REJECTED]</prefix>
  <notice>
The Security Policy of XXX does not allow to forward messages containing attachments having any of the extensions .exe, .com, .bat, .cmd, .pif, .scr, .vbs, .avi, .mp3, .mpeg, .shs, therefore your message has been rejected.

Please don't reply to this e-mail as it has been automatically sent by the antivirus system.

Regards, Postmaster XXX.YYY
.....................................
  </notice>
</mailet>
 -->

다음 설정은 내부 사용자가 메일을 보내면(SenderIsLocal),  발신자의 보낸 편지함(Sent)에 메일을 저장하도록하는 설정이다.

이 설정은 기본 사용으로 되어 있는데, MUA로 메일을 발송하는 경우 MUA에서 보낸 편지함에 저장하고 James에서도 보낸 편지함에 저장하면서 MUA의 보낸 편지함에 2개의 동일한 메일이 저장된다.

         <!-- Place a copy in the user Sent folder -->
         <mailet match="SenderIsLocal" class="ToSenderFolder">
           <folder>Sent</folder>
           <consume>false</consume>
         </mailet>

Apache James에서 이 기능을 중지하고 사용해면 해결되는데,

Apache James를 기반으로 웹 메일을 구축한 경우 서버에 보낸 메일이 남지않는 문제가 생긴다.

 

mailbox.xml는 주고 받은 메일을 저장하는 형태를 지정하는 파일이다.

<mailbox>
   <!-- supported providers are: -->
   <!-- jpa, maildir, memory -->
   <!-- Be aware that maildir will only work on unix like operation systems! -->
   <provider>jpa</provider>
</mailbox>

mailbox.xml

jpa, maildir, memory의 세가지 방식이 제공되는데,

jpa는 OpenJPA를 이용하여 메일 정보를 각종 데이터 베이스 (MariaDB, Oracle 등)에 저장하여 관리하는 것으로 기본 설정으로 지정되어 있다.

maildir는 하나의 메일을 EML 파일로 저장하고, 전체 리스트등을 Text 파일로 관리하는 방식을 의미한다.

메일 사용자, 도메인 등은 jpa와 동일하게 OpenJPA를 이용하여 데이터베이스에 저장된다.

memory는 일종의 테스트 용으로 maildir와 유사하지만 메일 정보를 파일이 아닌 메모리에 저장한다.

James를 재가동하면 메일 송수신 내역이 사라진다.

이 3가지 방법에 대한 자세한 사용 방법은 따로 정리하였다.

이외에도 cassandra등이 지원된다고 한다.

 

개인적으로 메일의 첨부 파일을 데이터 베이스에 저장하는 것을(jpa방식) 좋게 생각하지 않는데,

maildir는 개인별 메일 리스트를 Text 파일로 관리하면서, 메일 양이 많은 경우 속도가 떨어지는 문제가 있다.

(왜 속도가 떨어지는지 해당 코드를 분석해서 알고 있지만 수정해서 기여할 여력(?)이...)

따라서, 메일의 헤더(보낸사람, 받는사람, 제목등)는 데이터베이스에

양이 많은 본문과 첨부 파일은 파일로 저장하는 방식이 좋을 것 같아서 방법을 찾고 있다.

특히, 웹 메일을 구현하려면 JPA 방식으로 구현되어야 하는데, 첨부 파일을 데이터베이스에 저장하는 것이...

자세한 사용 방법은 따로 정리하였다.

 

다음 파일은 JPA 사용시 접속할 데이터베이스 접속 정보를 지정하는 james-database.properties 파일이다.

사용할 데이터베이스(database=DERBY)를 지정하고,

JAVA에서 JDBC를 이용해서 데이터베이스에 접속하는 4가지 기본 정보를 지정하면 된다.

database.driverClassName=org.apache.derby.jdbc.EmbeddedDriver
database.url=jdbc:derby:../var/store/derby;create=true
database.username=app
database.password=app

# Supported adapters are:
# DB2, DERBY, H2, HSQL, INFORMIX, MYSQL, ORACLE, POSTGRESQL, SQL_SERVER, SYBASE
vendorAdapter.database=DERBY


openjpa.streaming=false

james-database.properties

다음 파일은 usersrepository.xml로 사용자 계정의 암호화 방식을 지정한다.

<!-- JPA based backend. Support password algorithm are:
  MD5, SHA-256, SHA-512, NONE
-->

<usersrepository name="LocalUsers" class="org.apache.james.user.jpa.JPAUsersRepository">

    <algorithm>MD5</algorithm>
    <enableVirtualHosting>true</enableVirtualHosting>
</usersrepository>

usersrepository.xml

기본은 MD5인데 SHA-256을 지정해서 사용하는 것이 좋다.

 

마지막으로 정리할 파일은 wrapper.conf로 사용할 메모리를 지정 등 Java 실행 환경을 지정할 수 있다.

# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=3
wrapper.java.initmemory=128

# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=64
wrapper.java.maxmemory=512

# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO

wrapper.conf

기본적으로 메모리를 MB 단위로 지정했는데, 처리 양이 많은 경우 GB 단위로 하는 것이 좋고,

James의 각종 처리를 확인하기 위해서는 로그 단위를 INFO보다 DEBUG등으로 하는 것이 좋다.

James 로그는 Log4J를 사용하나 Log4J를 찾아보고, log4j2.xml에서 설정한다.

 

 

 
앞서 설치한 Apache James 메일 서버에 접속해서 메일을 보내고 받는 방법을 정리한다.

메일을 보내고 받는 방법은 간단하게는 텔넷(telnet)을 이용할 수 있고, 전용 프로그램(Mail Transfer Agent - MTA)을 설치해서 이용할 수도 있다.

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

 

사전 작업

메일 접속을 하기 전에, 앞서 James를 실행하면서 지정한 forest71.com 도메인을 등록한다.

실제 도메인을 사용한 경우에는 신경 쓰지 않아도 되지만, 개발자가 임의로 지정한 도메인인 경우에는 운영체제에 임의로 등록해서 사용해야 한다.

 

먼저 James를 설치한 PC가 윈도우일 경우에는 윈도우 시작 메뉴에서 관리자 권한으로 메모장을 실행하고,

C:\Windows\System32\drivers\etc 폴더에 있는 hosts 파일을 열어서 다음과 같이 수정한다.

127.0.0.1은 현재 사용 중인 PC를 의미하고,

임의로 지정한 forest71.com 도메인은 127.0.0.1를 가르키도록 지정했다.

다른 PC에 제임스를 실행한 경우에는 해당 PC의 IP를 지정하면 된다.

 

리눅스일 경우에는 etc/hosts를 관리자 권한으로 수정한다.

       sudo vi /etc/hosts

윈도우와 동일하게 127.0.0.1을 임의의 도메인 forest71.com로 지정한다.

네트워크 상태를 점검하는 명령어인 ping으로 forest71.com의 IP를 확인할 수 있다.

       ping forest71.com



1. 텔넷(Telnet)

텔넷은 간단하게 메일 서버가 제대로 작동하는지 확인하기 위해 많이 사용하는 방법으로, 각종 명령어를 직접 입력해야 하는 불편함이 있다.

하지만, 폐쇄망일 경우에 별도의 MUA를 설치할 수 없는 경우가 많아, 많은 사람들이 이용하는 방법이다.

리눅스일 경우에는 기본 설치되어 있고, 윈도우는 추가 설치를 해야 한다.

설치 방법은 [윈도우 텔넷]으로 검색하면 쉽게 찾을 수 있다.


텔넷을 설치한 후에, 운영체제에 관계없이 콘솔에서 다음 명령어 중 하나로 텔넷을 실행한다.

메일 발송(SMTP-25)을 먼저 테스트한다.

              telnet localhost 25
              telnet 1270.0.01 25
              telnet forest71.com 25

localhost는 현재 텔넷을 실행한 컴퓨터의 도메인을 의미하는 것으로 127.0.0.1과 같은 의미이다.

메일 서버가 텔넷을 실행하는 서버에 있는 경우 위와 같이 IP를 지정하고, 다른 서버에 있는 경우에는 해당 메일 서버의 도메인이나 IP를 지정한다.

메일을 발송할 것이라 SMTP 포트인 25번으로 접속한다.

 

당연하겠지만 메일을 가져올 때는 IMAP 포트인 143으로 접속한다.

모든 설정이 제대로 된 경우 다음과 같은 SMTP 메시지가 입력되고 커서가 깜박인다.

ehlo 명령어로 메일 전송을 시작한다.

      ehlo test

ehlo 다음에는 아무 값이나 입력하면 된다.

위와 같은 메시지가 출력되면,

메일을 보내는 사람 mail from:<gujc1@forest71.com>

메일을 받는 사람 rcpt to:<gujc1@forest71.com>

을 입력하고 메일 내용을 작성하기 위해 data를 입력하고 <enter>키를 누른다.

메일 제목을 입력하고 Subject: test mail

본문을 입력한 뒤에 this is a test mail

점(.)을 입력하고 <enter>키를 누르면 메일이 발송된다.

메일 제목을(Subject) 입력한 뒤에 <enter>키를 눌러 <CRLF>를 추가하고 메시지를 입력해야

메일 제목과 본문이 구분된다.

그렇지 않으면 제목이 없는 메일이 발송된다.

 

이번에는 받은 메일을 가져오는 IMAP을 연습해 보기 위해 콘솔에서 다음 명령어 중 하나로 텔넷을 실행한다.

              telnet localhost 143
              telnet 1270.0.01 143
              telnet forest71.com 143

IMAP 환영 메시지가 나오면,

메시지를 확인할 계정과 비밀번호를 지정해서 다음과 같이 login을 한다.

         a login  gujc1@forest71.com gujc1234

list 명령어로 로그인한 계정의 메일함 종류를 확인한다.

         a list "" "*"

별도의 메일함을 생성하지 않았기 때문에

기본 메일함인 받은 편지함(INBOX), 보낸 편지함(Sent), 삭제함(Trash)등이 출력된다.

받은 메일을 읽기 위해 받은 편지함(INBOX)을 선택한다.

           a select inbox

하나의 메일(1 EXISTS)이 있다고 표시된다.

이미 한번 읽었기 때문에 0 RECENT로 표시 되는데, 안 읽은 메시지가 있으면 안 읽은 메시지 개수가 표시된다.

 

fetch 명령어로 하나의 메일에 대한 내용을 확인 할 수 있다.

       a fetch 1 body[]

1 은 메일 서버에서 메일함 별로 부여하는 메일 고유 번호로 (uid라고 한다),

메일 개수를 번호로 생각하고 지정하면 된다.

여기서는 위 그림과 같이 하나의 메일, 첫번째 메일의 내용을 보여 준다.

 

이외에도 imap은 다양한 명령어가 있으니, [imap 명령어]로 관련 내용들을 찾아서 익혀두는 것이 좋다.

 

주의: IMAP에서는 특정 계정으로 로그인을 했지만, SMTP에서는 로그인을 하지 않았다.

SMTP에서 로그인을 하지 않고 메일을 발송할 수 있었던 이유는 James SMTP 설정 파일인 smtpserver.xml의 속성 중에서 <authorizedAddresses>에서 로컬 IP(127.0.0.1)를 지정했기 때문이다.

<authorizedAddresses>속성으로 지정된 IP에서 보내는 메일은 로그인을 하지 않고 메일을 발송한다.

SMTP 로그인은 계정 정보를 Base64로 변환해서 입력해야 하는데, 상세한 내용은 [SMTP 명령어]로 검색해서 익혀두는 것이 좋다.

로그인을 해서 메일을 발송하는 경우에는 다음과 같이 MUA(Mail User Agent) 사용하는 것이 편리하다.


2.  Mail User Agent

이메일을 읽고 보내는 이메일 클라이언트 프로그램들은(Mail User Agent) 인터넷으로 쉽게 구할 수 있다.

무료와 유료가 다양하게 제공되는데, 기업에서는 제법 오래전 부터 아웃룩(Outlook)이 독보적이다.

다만, 아웃룩은 메일 서버에 인증서 설정이 되어 있지 않으면 쉽게 계정을 등록할 수 없다.

 

개인적으로 PC에서는 오픈 소스인 썬더 버드를 선호한다.

썬더버드와 같은 MUA를 사용하면 메일을 쉽게 주고 받을 수 있는데, 현재 로컬에 개발로 설정하였기 때문에 썬더버드에서 메일을 발송하면 메일은 잘 발송되지만, 발송된 메일을 보낸 편지함(sent)에 저장하면서 오류가 발생한다.

그냥 무시하고 사용해도 된다 (?).

 

자세한 설치는 [썬더버드 설치]로 검색해서 익혀두고, 여기에서는 계정 등록시 주의해야 할 사항을 정리한다.

다음 그림과 같이 이메일 계정 등록 화면에서 하단에 있는 [수동으로 구성]을 선택한다.

[수동으로 구성]을 선택하면, 다음 그림과 같이 SMTP와 IMAP 서버 주소를 입력하는 창에 자동으로 도메인 앞에 점(.)이 붙어 생성된다.

SMTP와 IMAP 프로토콜 별로 서버 도메인을 등록하기 때문에 점이 붙는데,

smtp.forest71.com, imap.forest71.com 같이 하위 도메인을 프로토콜별 서버 주소로 입력해야 한다.

또는 합쳐서 mail.forest71.com과 같은 도메인을 등록해서 사용한다.

여기에서는 임의의 도메인을 만들어서 사용하는 것이기 때문에 하위 도메인 없이 구현하였다.

따라서 점(.)을 제거하고 forest.com만 서버 주소로 입력한다.

단, 썬더버드를 설치한 PC의 hosts 파일에 forest.com을 등록해야 한다.

아니면 James를 설치한 서버 주소 IP를 직접 입력해서 사용해도 된다.

 

모바일에서는 아웃룩을 사용하지 않는 것이 좋을 것 같다.

자주 (약 2주 간격) 업데이트하기도 하는데, 모바일의 특성상 메일 서버에 인증서가 설치되어 있어야 이메일 계정을 등록할 수 있다.

그나마 많이 사용하는 것이 스파크 인것 같고, 개인적으로는 gmail 앱을(gmail 메일 서버가 아니다.) 선호한다.

Android 폰에는 기본적으로 설치되어 있다.

모바일 MUA에 계정을 등록하려면 James에 인증서를 등록해서 실행해야 하기 때문에

모바일 MUA에 계정을 등록하는 방법은 정리하지 않는다.

Apache James를 설치하고 접속해서 메일을 주고 받는 것까지 정리하였고, 여기에서는 주고 받은 메일을 저장하는 방식에 대해서 정리한다.

 

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

 

앞서 정리한 conf 폴더의 설정 파일 중에서 mailbox.xml는 주고 받은 메일을 저장하는 형태를 지정하는 파일로,

James에서는 jpa, maildir, memory 등의 방식이 제공된다.

<mailbox>
   <!-- supported providers are: -->
   <!-- jpa, maildir, memory -->
   <!-- Be aware that maildir will only work on unix like operation systems! -->
   <provider>jpa</provider>
</mailbox>

mailbox.xml

jpa, maildir, memory의 세가지 방식이 제공되는데,

jpa는 OpenJPA를 이용하여 메일 정보를 각종 데이터베이스 (MariaDB, Oracle 등)에 저장하여 관리하는 것으로 기본 설정으로 지정되어 있다.

maildir은 하나의 메일을 EML 파일로 저장하고, 전체 메일 리스트 등을 Text 파일로 관리하는 방식을 의미한다.

메일 사용자, 도메인 등은 jpa와 동일하게 OpenJPA를 이용하여 데이터베이스에 저장한다.

memory는 일종의 테스트 용으로 maildir와 유사하지만 메일 정보를 파일이 아닌 메모리에 저장하기 때문에 James를 재가동하면 메일 송수신 내역이 사라진다.

여기에서는 maildir과 jpa 설정 방식에 대한 자세한 내용을 정리한다.



먼저, mailbox.xml에서 위와 같이 <provider>가 jpa로 지정되었는지 확인하고 (기본 설정),

conf 폴드의 james-database.properties 파일을 다음과 같이 수정한다.

database.driverClassName=org.mariadb.jdbc.Driver
database.url=jdbc:mariadb://127.0.0.1:3306/james_mail
database.username=root
database.password=gujc1004

# Supported adapters are:
# DB2, DERBY, H2, HSQL, INFORMIX, MYSQL, ORACLE, POSTGRESQL, SQL_SERVER, SYBASE
vendorAdapter.database=MYSQL

james-database.properties

james-database.properties 파일은 데이터베이스 방식을 사용하기 위해 데이터베이스 접속 정보를 입력하는 파일로 Java의 JDBC 설정 내용과 동일한 값을 입력한다.

기본 데이터베이스는 DERBY로 지정되어 있고, 앞서서 설정한 도메인(forest71.com), 사용자(gujc1@forest71.com), 메일 송수신 정보 등이 DERBY에 저장되어 있다.

DERBY는 많은 데이터를 처리하기 어렵고 관련 자료를 구하기도 어렵다.

여기에서는 James가 OpenJPA로 지원하는 여러가지 데이터베이스 중 보편적인 MariaDB를 사용한다.

MariaDB를 설치하는 방법은 여기서 정리하지 않으니 인터넷 자료를 찾아서 설치하고, james_mail이라는 데이터베이스를 생성하면 된다.

다른 데이터베이스를 생성한 경우에는 위 코드에서 database.url에 해당 데이터베이스 이름을 지정하면 된다.

 

주의: MariaDB를 사용하지만 드라이버 클래스 이름만 mariadb를 지정하고, vendorAdapter.database 변수에는 MYSQL을 지정해서 사용한다.

MariaDB대신에 MYSQL을 설치해서 사용해도 된다.

 

MariaDB와 Apache James를 연결하기 위한 JDBC 드라이버를 MariaDB 드라이버(Connector/J) 공식 사이트에서 다운로드 받는다.

Java용 라이브러리를 선택하고, download 버튼을 클릭한다.

다운로드 받을 때, 다음 그림의 왼쪽과 같이 이메일 등의 개인 정보를 입력하라고 하는데,

입력하지 않고 가만이 있으면 다운로드가 진행된다.

다운로드 받은 jar파일을(현재는 mariadb-java-client-2.7.1.jar) 복사해서

James의 conf폴더 하위에 있는 lib(james-server-app-3.5.0\conf\lib) 폴더에 넣어준다.

그리고, 제임스를 재가동(james restart)한다.

 

제임스를 재가동하면 데이터베이스를 MariaDB로 변경하였기 때문에

앞서서 설정한 도메인(forest71.com), 사용자(gujc1@forest71.com), 메일 송수신 정보가 없다.

콘솔창에서 사용자를 다시 생성한다.

     james-cli.bat adduser gujc1@forest71.com gujc1234

도메인은 따로 설정 파일에서 (domainlist.xml) 등록했기 때문에 다시 생성하지 않아도 된다.

 

데이터베이스 관리도구로 MariaDB에 접속하면 지정한 데이터베이스(james_mail)에 자동으로 테이블들이 생성되어 있고

도메인 테이블(james_domain)에 임의로 사용하는 도메인(forest71.com)이 등록되어 있는 것을 볼 수 있다.

james_user 테이블에 새로 생성한 사용자가

james_mailbox에는 사용자별 메일함이

james_mail에는 송수신한 메일들이 저장되어 있다.

 

대량의 메일을 관리하기에는 MariaDB나 Oracle등의 DBMS를 사용하는 것이 좋은데

첨부파일도 데이터베이스에 저장하는 것이 좋은지에 대해서는 의문이 있다.

지나치게 데이터 베이스 용량이 커지면서 백업과 복구에 소요되는 시간등의 문제가 있을 것 같다.

 

이번에는 JPA외에 전통적인 text 방식으로 관리하는 maildir 방식으로 구현한다.

다만, text 방식은 윈도우에서 제대로 작동하지 않는다.

이유는 아래에 정리하였으며, 여기에서는 리눅스로 정리한다.

mailbox.xml에서 다음과 같이 <provider>를 maildir로 변경한다.

<mailbox>
   <!-- supported providers are: -->
   <!-- jpa, maildir, memory -->
   <!-- Be aware that maildir will only work on unix like operation systems! -->
   <provider>maildir</provider>
</mailbox>

mailbox.xml

그리고, 제임스를 재가동(james restart)한다.

 

conf 폴더에 있는 mailbox-maildir.properties 파일에는 다음과 같은 내용이 있다.

maildir.folder=../var/store/maildir/%domain/%user
maildir.messageNameParser.strictMode=false

mailbox-maildir.properties

James를 설치한 폴더의 하위에 var 폴더 하위로 이어지는 위와 같은 경로가 있다.

이중 도메인(%domain)은 forest.com이고, 사용자(%user)는 gujc1이다.

즉, james-server-app-3.5.0\var\store\maildir\forest71.com\ 폴더에 사용자별로 폴더가 생긴다.

메일을 하나 발송한 뒤에 해당 폴더를 확인하면 다음과 같은 폴더들이 생성된다.

각 계정의 기본 폴더(gujc1)가 받은 메일함(inbox)이고

보낸 메일함은 .Sent이고, 각 폴더 안에 new와 cur 폴더가 있다.

새로 받은 메일은 new 폴더에, imap 접속하고 나면 cur폴더에 EML 파일이 생성된다.

 

다음 그림과 같이 메일의 EML 파일명에 콜론(:)이 포함되어 있다.

이 콜론이 윈도우에서는 파일명으로 사용할 수 없는 특수 문자라서 maildir 방식은 리눅스에만 사용할 수 있다.

 

maildir로 지정하면 메일 내용은 EML 파일로 생성해서 관리하고, 계정별 메일 리스트는 james-uidlist라는 텍스트 파일로 관리한다.

james-uidlist는 메일함 별로 생성되어 관리하는데,

한 사용자가 하나의 메일함에 메일을 많이 가지고 있는 경우 처리 속도가 느린 단점이 있다.

 

송수신된 메일들을 파일로 처리하기 때문에,

앞서서 메일 정보를 저장하는 james_mail 테이블을 확인하면 메일이 추가 되지 않는 것을 확인할 수 있다.

 

+ Recent posts