Operating System/Linux2007/06/19 09:12

4. 한글지원

Mail에서 사용되는 SMTP Protocol은 기본적으로 7bit문자만을 기반으로 제작되었습니다. 하지만 한글의 경우 EUC-KR로 표현하면 8bit를 사용하기 때문에 문제가 생길 수 있습니다. 따라서 Mail에서 사용하기 위해 한글의 7bit 표현방법인 ISO-2022-kr(RFC 1557)이 만들어 졌고 Mail의 본문에 사용되었습니다. (Header에는 EUC-KR을 B나 Q Encoding 방법으로 Encoding해서 사용했습니다.). 하지만 대부분의 Program에서는 한글을 8bit표현방법인 EUC-KR을 사용했으므로 이 두 표현간의 변환을 해 주는 Program이 필요했습니다. 이 작업은 크게 MTA, MDA, MUA에서 해 줄 수 있습니다. MTA에서 변환을 해 주는 대표적인 Program이 sendmail 8.6.12h2입니다. 이 Program은 Program으로부터 8bit표현을 입력으로 받아서 다른 곳으로 전송할 때 ISO-2022-kr로 변환한 후 전송을 하고, Network을 통해 받은 ISO-2022-kr로 표현된 Mail을 EUC-KR로 변환 후 Mail Box에 저장하도록 만들어 졌습니다. 그래서 몇 년 전까지만 해도 대부분의 Mail Server에서 sendmail 8.6.12h2를 사용했었습니다.

하지만 SMTP Protocol이 8bit문자를 지원하는 ESMTP Protocol로 변하면서 본문에서도 ISO-2022-kr대신에 EUC-KR을 사용하도록 표준이 바뀌었습니다. 하지만 이 안을 정식 표준으로 공표하지 않았고, 아직까지 Internet에는 ISO-2022-kr 로 표현된 Mail이 돌아다니기 때문에 이 Mail을 EUC-KR로 변환해 주는 작업이 추가적으로 필요하게 되었습니다.

ISO-2022-kr을 EUC-KR로 변환해 주는 Program들은 UNIX환경에서는 많이 만들어 졌습니다. hconv와 hmconv가 대표적인 Program입니다. 이제 관리자가 해 줘야 하는 일은 sendmail이 받은 Mail을 Mail Box로 저장하기 전에 이 Program을 통과하게 만들어서 ISO-2022-kr을 EUC-KR로 변환만 해 주면 되게 되었습니다. 이렇게 Filtering을 가능하게 해 주는 대표적인 Program이 procmail입니다.

여기에서는 procmail을 이용하여 한글 Mail을 처리하는 과정을 설명 드리겠습니다. 여기에서 알아두셔야 할 내용 중에 중요한 내용으로 MDA에 대한 이해입니다. MDA(Mail Delivery Agent)는 MTA(Mail Transfer Agent, 대표적인 예는 sendmail입니다.)가 받은 Mail의 최종적인 도착지가 현재 Host인 경우(sendmail의 경우 sendmail.cw를 참고하여 결정합니다.) Mail을 MDA에게 넘겨줍니다. 보통 System의 기본적인 MDA는 /bin/mail입니다. procmail은 /bin/mail대신에 사용할 수 있는 Program으로 Filtering 기능이 강력하여 한글처리에 이용할 수 있습니다.

또 잘못 이해하시는 분들 중에 procmail자체가 한글 Decoding을 해준다고 알고 계신 분들이 많습니다. 이것은 잘못된 것입니다. 실재로 procmail도 한글 Decoding을 위해 다른 Program(보통 hcode나 hmconv를 이용합니다.)을 이용합니다. procmail이 하는 일은 단순히 어떤 Header가 있을 때 적당한 Program을 불러 한글 Decoding을 해 줍니다.

따라서 procmail뿐만 아니라 한글 Decoding을 위한 Program을 설치하셔야 합니다. 여기에서는 hcode를 사용하도록 하겠습니다.

hcode는 ftp://ftp.kaist.ac.kr/hangul/code/hcode/에서 구할 수 있습니다. 가져온 Program을 적당한 Directory에 풀고 Source Directory에서 단순히 make를 입력하면 Compile이 완료됩니다. Compile 결과로 생긴 hcode를 /usr/local/bin 에 복사해 둡니다.(다른 Directory도 상관없습니다.)

그다음 procmail을 설치합니다. procmail은 대부분의 ftp Server에서 구할 수 있습니다. (저의 경우 이곳에서 구했습니다.) Program을 구한 후 Directory에서 make를 입력한 후 Message에 나온 대로 대답하면 설치할 수 있습니다. 만들어진 procmail을 역시 /usr/local/bin에 설치합니다.

그런다음 /etc/procmailrc를 아래와 같이 만들어 둡니다.

LOGFILE=/var/log/procmail
VERBOSE=no
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/sh

:0 B
*^.\$\)C
{
:0 fbw
|hmconv -u

:0 fhw
* ^Content-Type: text/plain
|formail -c -I "Content-Type: text/plain; charset=EUC-KR" -I \
"Content-Transfer-Encoding: 8bit"

:0 Efhw
* ^Content-Type: text/html
|formail -c -I "Content-Type: text/html; charset=EUC-KR" -I \
"Content-Transfer-Encoding: 8bit"

:0 Efhw
* !^Content-Type:
|formail -c -I "Content-Type: text/plain; charset=EUC-KR" -I \
"Content-Transfer-Encoding: 8bit"

# Note that '-c' flag has been added to formail invocation.
# It concatenates a header of multiple lines into a single line
# so that a bug in 'hcode -dk -m' dealing with RFC 2047 encoded header
# has less 'harmful' effect.

:0 fhw
| formail -A \
"X-Automatic-Korean-Mail-Conversion: iso-2022-kr to euc-kr"

}

DROPPRIVS=yes

:0 fhw
*Content-Type:.+; charset="?EUC-KR
| formail -c | hcode -dk -m

:0 Efhw
*^(Subject|From|Cc):.*=\?EUC-KR\?(B|Q )\?
| formail -c | hcode -dk -m

그다음 sendmail에서 MDA로 procmail을 사용할 수 있도록 sendmail.cf File을 수정해 줘야 합니다. sendmail.cf File에서 Mlocal부분을 찾아서 아래와 같이 수정하시면 됩니다.

Mlocal, P=/usr/local/bin/procmail, F=lsDFMAw5:/|@Q SPfhn9, S=10/30, R=20/40,
T=DNS/RFC822/X-Unix,
A=procmail -Y -a $h -d $u

하지만 이 방법보다는 mcFile에 FEATURE(local_procmail)을 추가하여 sendmail.cf를 생성하는 방법이 좋습니다.

제가 여기에서는 간단하게 설명을 드렸지만 좀더 자세한 내용이 필요하신 분은 신정식님의 Sendmail 8.8.x 이후 판과 Procmail을 이용한 한글 Mail 처리를 참고하시기 바랍니다.

이 작업이 귀찮게 느껴지신다면 위에서 하는 작업과 동일한 일을 하는 한글 sendmail을 설치하시면 됩니다. 하지만 한글 sendmail은 영문 sendmail에 비해 Version도 낮고, 또 다른 오류가 생길 확률이 높기 때문에 위의 방법을 사용하시기 바랍니다.

Creative Commons License

'Operating System > Linux' 카테고리의 다른 글

Sendmail (문제해결)  (0) 2007/06/20
Sendmail (Virtual Host)  (0) 2007/06/20
Sendmail (난 Spam이 싫어요)  (0) 2007/06/20
Sendmail (Third Party Relay)  (0) 2007/06/20
Sendmail (sendmail.cf에 관한 얘기)  (0) 2007/06/20
Sendmail (한글지원)  (0) 2007/06/19
Sendmail (추가적인 작업들)  (0) 2007/06/19
Sendmail (Compile & Installation)  (0) 2007/06/19
Sendmail (Sendmail이란?)  (0) 2007/06/19
Linux Security How-To (FAQ/결론)  (0) 2007/06/18
Linux Security How-To (색인)  (0) 2007/06/18
Posted by BLUEDAY™