BBUWOO'S [ LIKE UNIX ] WORLD Home > Lecture > Sendmail > Sendmail-8  

HOME
WHAT's BBUWOO?
LInux AnNyung
Open Source
    GitHUB
    GitHUB (for PHP)
LECTURE
MINI LECTURE
QnA BOARD
ENGLISH POEM


WARNNING

강좌의 모든 권리는 본인 김정균에게 있으며 이 강좌를 상업적 목적 으로 이용
하거나 다른 곳으로 옮길시에는 본인의 허락이 있어야 한다. 이글의 가장 최신글은
http://oops.org 에서 확인할수 있다.



11. AUTO REPLY (자동응답 메세지) 구현

이번 파트에서는 메일이 왔을 경우 자동으로 메일을 받았다는 응답 메세지를 보내주거나
또는 출장등의 이유로 일정 기간동안 메일 확인이 어려울 경우를 통보해 주고 싶을 경우
에 응답 메일을 보내는 기법을 설명하고자 한다.

여기서는 2가지 방법을 제시하게 된다. 하나는 procmail 을 이용한 방법이 있으며 또 하
나는 응답메일 전용 프로그램 이자 sendmail 에서 지원 하는 vacation 에 대해서 설명을
하고자 한다.

1. procmail 을 이용한 방법

procmail manual page 에 나와있는 간단한 자동 응답 처리법이다. 이것을 처리하기 전에
메일링 리스트로 부터 오는 메일이나 bouncing mail 같은 데몬으로 부터 오는 메일 또는
자동응답으로 인하여 내가 받게되는 메일을 제외 하도록 처리를 해야 한다. 만약 이것을
주의하지 않으면, 예상치 못한 결과를 가지고 올수 있다. (무한루프가 될수 있다는 얘기
이다.) 들어오는 모든 메일에 자동응답 처리를 하기 위해서는, rcfile 의 다른 모든처리
이전에 다음의 처리를 넣어야 한다. 그러나 mailinglist 신청이 진행되는 과정의 어떠한
처리 이후에 오는 것이 좋다. 일반적으로 mailinglist 에 자동 응답하게 하는 것은 좋은
생각이 아니기 때문이다. (물론 !^FROM_DAEMON 정규표현식에서 이것을 미리 처리를 하면
신경쓸 필요는 없다.)

일단 계정의 홈디렉토리에 .procmailrc 라는 파일과 autoreply.txt 라는 파일을 생성 하
도록 한다. 두 파일의 내용은 아래를 참고 하도록 한다. .procmailrc 에서는 자동응답이
구현되도록 설정을 하게 되며, autoreply.txt 에는 응답 메세지를 작성하게 된다.


 Hanterm - cat $HOME/.procmailrc

 [oops@oops oops]# cat .procmailrc

  :0 h c
  # daemon 과 mailinglist 들에게 응답하지 않는다.
  * !^FROM_DAEMON
  # 메일 루프를 하지 않은 주소를 적어준다 (본인 메일 적으면 된다)
  * !^X-Loop: your@own.mail.address
  | (formail -r -I"Precedence: junk" \
     -A"X-Loop: your@own.mail.address" ; \
     cat $HOME/autoreply.txt) | $SENDMAIL -t

 [oops@oops oops]#

위에서 your@own.mail.address 는 자신의 email 주소를 적어주면 된다. 그외의 나머지는
그냥 그대로 사용을 하고 주석라인은 삭제를 하면된다. man page 에 따르면 좀더 세밀한
설정은 아래와 같이 할수 있다고 하지만, 테스트 해 본바는 없다.


 Hanterm - cat $HOME/.procmailrc

 [oops@oops oops]# cat .procmailrc

  :0 Whc: vacation.lock
  # mail 주소가 나를 지칭 하는 것인지 간단히 체크한다.
  * $^To:.*\<$\LOGNAME\>
  # daemon 과 mailinglist 들에게 응답하지 않는다.
  * !^FROM_DAEMON
  # 메일 루프를 하지 않은 주소를 적어준다 (본인 메일 적으면 된다)
  * !^X-Loop: your@own.mail.address
  | formail -rD 8192 vacation.cache

  :0 ehc         # 만약 이름이 cache 에 없으면..
  | (formail -rI"Precedence: junk" \
     -A"X-Loop: your@own.mail.address" ; \
     echo "I received your mail,"; \
     echo "but I won't be back until Monday."; \
     echo "-- "; cat $HOME/autoreply.txt \
     ) | $SENDMAIL -oi -t

 [oops@oops oops]#

$HOME  과 $SENDMIL 은 procmail 에서 사용 하는 환경변수이기 때문에 별로 신경을 쓰지 
않아도 상관은 없으며 $SENDMAIL 은 기본적으로 /usr/sbin/sendmail 로 지정되어 있으므
로 이 path 가 아닌 사람은 직접 경로를 지정해 줘야 한다.

실제 procmail 의 경우에 RH 6.2 까지는 잘 작동을 했던 것 같다. 그런데 sendmail 8.10
이상 버젼의 smtp auth 기능과 업데이트 되어진 procmail 에서는 이게 제대로 작동을 하
지 못한다는 느낌이 드는적도 많다. 이 자료가 예전 자료이기 때문에 형식이 변경되어서
그런것인지 아닌지는 필자도 판단을 보류하고 있다. 즉 위의 설정이 잘되면 사용하면 그
만이고 잘 안될 경우에는 다음에 소개를 하는 전용 프로그램을 대안으로 제시를 하는 것
이다.


2. VACATION 을 이용한 자동응답

vacation 은 자동으로 메일에 응답하는 프로그램이다. 계정 home directory 에 .forward,
.vacation.msg .vacation.db 3개의 파일로 작동을 하게 된다. vacation 은 독립 프로젝트
이기는 하지만 sendmail 소스 안에 포함이 되어 있다. 일단 설치를 하기 전에 이미 설치
가 되어있는 sendmail 에 vacation 이 포함이 되어 있는지 부터 확인을 해 보기 바란다.
간단하게 find /usr -name vacation 명령으로 이 파일이 있는지 살펴보고 없으면 설치
를 하고 있으면 설치과정은 띄어 넘어도 되겠다. 단 sendmail 에 있는 vacation 을 사용
할때는 vaclook 은 지원을 하지 않는다.

그럼 설치법 부터 알아 보도록 하자.

vacation 은 http://download.sourceforge.net/vacation/ 에서 소스를 구할수 있으며 최
신 버젼은 1.2.5 이다. 일단 이 파일을 받아와서 /usr/local/src 에서 소스의 압축을 풀
도록 한다.


 Hanterm - tar xvfpz vacation-1.2.5.tar.gz

 [root@oops /usr/local/src]# tar xvfpz vacation-1.2.5.tar.gz

  vacation/
  vacation/CVS/
  vacation/CVS/Root
  vacation/CVS/Repository
  vacation/CVS/Entries
  vacation/ChangeLog
  vacation/COPYING
  vacation/OLD/
  vacation/OLD/CVS/
  vacation/OLD/CVS/Root
  vacation/OLD/CVS/Repository
  vacation/OLD/CVS/Entries
  vacation/OLD/aliases.man
  vacation/OLD/vacation.c-1.1.2
  vacation/TODO
  vacation/Makefile
  vacation/README
  vacation/vacation.c
  vacation/tzfile.h
  vacation/README.smrsh
  vacation/vaclook
  vacation/vacation.h
  vacation/vacation.man
  vacation/contrib/
  vacation/contrib/CVS/
  vacation/contrib/CVS/Root
  vacation/contrib/CVS/Repository
  vacation/contrib/CVS/Entries
  vacation/contrib/vaclook
  vacation/contrib/vacation-1.2.3-makebackup.patch
  vacation/patches/
  vacation/patches/CVS/
  vacation/patches/CVS/Root
  vacation/patches/CVS/Repository
  vacation/patches/CVS/Entries
  vacation/patches/fork.patch
  vacation/patches/vacation-1.1.111.patch.tgz
  vacation/patches/vacation-patch-kirch
  vacation/patches/vacation-patch-uphoff
  vacation/patches/vacation.c.patch
  vacation/patches/vacation-patch-michael-sweet
  vacation/vacation-1.2.5.lsm
  vacation/vaclook.man
  vacation/INSTALL
  vacation/AUTHORS

 [root@oops /usr/local/src]# cd vacation
 [root@oops /usr/local/src/vacation]# 

압축을 풀고 vacation 디렉토리로 이동을 한다. 일단 압축을 풀고나서 설치를 시작 하기
전에 설치 과정에 대해 잠깐 언급을 한다. 일단 설치를 하면 vacation 이라는 binary 파
일 하나가 설치가 되고 install 과정 에서는 vacation, vaclook, vacation manual page,
vaclook manual page 이렇게 4개의 파일이 설치가 되게된다. 그리고 기본값으로 vacation
과 vaclook 은 /usr/bin 에 설치되며, man  page 들은 /usr/man/man1 에 설치가 되게 된
다. 설치 위치를 변경하고 싶은 사람들을 위해 Makefile 을 수정하는법을 잠깐 설명하고
넘어가겠다.


 Hanterm - cat /usr/loca/src/vacation/Makefile

 [root@oops /usr/local/src/vacation]# cat Makefile

  # Makefile for vacation 1.2.5
  # 03/22/00 Sean Rima (thecivvie@softhome.net)
  # 07/28/95 Harald Milz (hm@seneca.ix.de)
  # 04/02/97 Harald Milz (hm@seneca.muc.de)

  ...... 생략 ......
  
  # where things go
  BINDIR          = /usr/bin
  VACATION        = $(BINDIR)/vacation
  VACLOOK         = $(BINDIR)/vaclook
  MANDIR          = /usr/man/man
  MANEXT1         = 1

  실제 설치되는 곳을 설정한 변수값은 BINDIR 과 MANDIR 2 개 이다. 즉 이
  2 개의 변수값만 변경을 해 주면 된다는 얘기이다. 여기서는 예를 들어서
  /usr/local/vacation 아래에 모든 파일이 설치가 되게 할것이다. 그럼 두
  변수의 값을 다음과 같이 수정을 한다.

  BINDIR          = /usr/local/vacation/bin
  MANDIR          = /usr/local/vacation/man/man

  VERSION         = 1
  SUBVERSION      = 2
  PATCHLEVEL      = 2

  # what are we making
  SRC             = vacation.c
  OBJ             = vacation.o
  BIN             = vacation

  # what we are packaging
  PACKAGE         = ChangeLog Makefile README tzfile.h \
                    vacation vacation.c vacation.h *.man COPYING \
                    contrib vacation-1.2.2.lsm patches OLD
  TGZFILE         = vacation-$(VERSION).$(SUBVERSION).$(PATCHLEVEL).tar.gz

  # rules

  all:    $(BIN)

  install:  all
          install -s -m 755 $(BIN) $(VACATION)
          install -s -m 755 vaclook $(VACLOOK)
          install -m 444 vacation.man $(MANDIR)$(MANEXT1)/vacation.$(MANEXT1)
          install -m 444 vaclook.man $(MANDIR)$(MANEXT1)/vaclook.$(MANEXT1)

  실제로 설치가 되는 부분은 이 부분이다. 이 부분을 약간 변경해 줄 필요
  성도 있을수 있다. 예를 들어 위에서 처럼 디렉토리를 변경했다면 위에서
  지정한 /usr/local/vacation/{bin/man} 은 존재하지가 않는다. 그렇기 때
  문에 이 설정 대로 install 을 하면 에러가 발생 하게 된다. 그러므로 미
  리 디렉토리를 생성해 주든지 아니면

  install -s -m 755 $(BIN) $(VACATION)

  바로 윗 라인에

  mkdir -p ${BINDIR} ${MANDIR}${MANEXT1}

  를 한줄을 넣어 줘서 해결을 할수가 있다. 예를 들어 다음과 같이 수정이
  된다.

  install:  all
          mkdir -p ${BINDIR} ${MANDIR}${MANEXT1}
          install -s -m 755 $(BIN) $(VACATION)
          install -s -m 755 vaclook $(VACLOOK)
          install -m 444 vacation.man $(MANDIR)$(MANEXT1)/vacation.$(MANEXT1)
          install -m 444 vaclook.man $(MANDIR)$(MANEXT1)/vaclook.$(MANEXT1)

  여기서 주의 할 것은 mkdir 과 install 앞의 공백은 반드시 tab으로 띄어
  야 한다.



  ...... 생략 ......

 [root@oops /usr/local/src/vacation]#

Makefile 을 수정을 하든안하든 그건 설치하는 사람의 마음이다. 다만 여기서는 기왕 수
정을 했으니 수정을 한 것을 기준으로 계속 설명을 하겠다. 또는 이 설치 과정이 귀찮은
사람은

ftp://mirror.oops.org/pub/Linux/Redhat/RPMS/6.x/vacation/
ftp://mirror.oops.org/pub/Linux/Redhat/RPMS/7.x/vacation/

에서 한글화가 되어진 rpm file 을 받을수 있으니 받아서 사용을 하기 바란다.

아 각설하고 그럼 설치를 하도록 하겠다. 설치는 간단하다. make install 명령으로 컴파
일과 install 을 모두 완료하게 된다.


 Hanterm - make install

 [root@oops /usr/local/src/vacation]# make install

  mkdir -p /usr/local/vacation/bin /usr/local/vacation/man/man1
  install -s -m 755 vacation /usr/local/vacation/bin/vacation
  install -s -m 755 vaclook /usr/local/vacation/bin/vaclook
  strip: /usr/local/vacation/bin/vaclook: File format not recognized
  install -m 444 vacation.man /usr/local/vacation/man/man1/vacation.1
  install -m 444 vaclook.man /usr/local/vacation/man/man1/vaclook.1

 [root@oops /usr/local/src/vacation]#

위의 과정을 거치고 나면 /usr/local/vacation 에 필요한 파일들이 설치가 된다. 나중에
삭제를 하고 싶으면 /usr/loca/vacation 만 삭제를 하면된다. 그럼 간단하게 응답메일을
설정 하는법을 보도록 한다. 일단 응답메일 설정을할 계정으로 로그인을 한다음 아무 옵
션 없이 vacation 명령을 실행하도록 한다.


 Hanterm - vacation

 [oops@oops ~oops]# vacation

  Subject: away from my mail

  I will not be reading my mail for a while.
  Your mail concerning "$SUBJECT"
  will be read when I'm back.

  :wq
 [root@oops ~oops]# cat .forward

  \root, "|/usr/bin/vacation root"

  .forward 가 무엇을 하는 파일인지는 알것이다. 즉 계정으로 오는 메일을
  원하는 곳으로 포워딩을 하는 것이다. 여기서는 일단 메일이 오면 자신에
  게로 먼저 포워딩을 한다. 무한 루프가 도는 것을 방지하기 위해 계정 이
  름 앞에 back slash 를 붙여 준다. 다음은 응답메일을 보내기 위해 vacation
  에게로 메일을 보내주게 설정을 한것이다. vacation 은 이렇게 메일을 받
  아서 응답 메일을 보내게 된다.


 [root@oops ~oops]# cat .vacation.msg

  Subject: away from my mail

  I will not be reading my mail for a while.
  Your mail concerning "$SUBJECT"
  will be read when I'm back.

  vacation 을 실행했을때 나온 내용과 동일하다. 즉 vacation 을 실행하면
  이 파일을 생성할 뿐 아니라 바로 이 파일을 편집할 수 있도록 editor 로
  열어준다.

 [root@oops ~oops]#

vacation 을 아무 옵션없이 실행을 하면 위에서 처럼 vi 가 열리며 해당글이 나온다. 이
글은 vacation 실행에 의해 생성된 .vacation.msg 파일의 내용을 편집할 수 있도록 자동
으로 열어 준것이다. Subject: 다음에 응답메일의 제목을 지정할수 있으며 그 아래는 원
하는 내용을 적으면 된다. $SUBJECT 는 받은 메일의 제목을 치환하니 필요하면 사용할수
있을 것이다.

다시 vacation 을 실행을 하고 나면 .forward, .vacation.msg, .vacation.db 3개의 파일
이 홈디렉토리에 생성이 된다. 이미 .forward 를 사용하고 있었다면 .forward.old 로 백
업이 되어 진다.

이렇게 되면 응답메일을 보낼 준비는 모두 완료가 되어진 것이다. 만약 응답 메일을 보
내고 싶지 않으면 간단하게 .vacation.msg 파일만 삭제를 해주면 된다. 그리고 다시 응
답메일을 보내고 싶다면 .vacation.msg 파일만 위의 형식으로 만들어 주면 된다.

또한 vaclook 명령을 실행하면 응답 메세지를 보낸 로그를 볼수가 있다.

이런 Error Message 가 발생하면.. :-)
응답 메세지가

sh: vacation not available for sendmail programs
554 "|vacation joe"... Service unavailable

과 같은 내용으로 오는 경우가 있다 이럴 경우에는 sendamil 의 smrsh 에 프로그램 등록
을 해 줘야 한다. 프로그램 등록을 하는 방법은 간단하다. 일단 sendmail 의 smrsh 디렉
토리를 알아야 한다. 보통 rpm 으로 설치를 하면 /etc/smrsh 라는 디렉토리가 있을 것이
다. 이 디렉토리에 /usr/local/vacation/bin/vacation 을 링크해 주면 된다. 즉

ln -sf /usr/local/vacation/bin/vacation /etc/smrsh

명령을 실행해 주면 된다. rpm 으로 설치하는 사람들은 이 작업들이 자동으로 완료가 된
다. 만약 rpm 으로 설치를 했는데 이 에러가 발생 한다면 /etc/smrsh 에 vacation 이 링
크가 되어 있는지를 확인해 보면 된다. 또는 링크가 깨진것이 아닌지를 확인해 본다.



>> 이전 : CF 문법을 이용한 SPAM Mail 차단
>> 다음 : SPF Configuration



    



 Home > Lecture > Sendmail > Sendmail-8

Copyright 1997-2017 JoungKyun Kim 
LAST MODIFIED: 2017/01/19