메일 포워딩 하면서 수신자 이메일 변경하기 (sendmail + incrontab + shell script)

리눅스/Mail|2021. 3. 25. 15:30
반응형

아래와 같은 상황이 발생하여 이를 해결하고자 스크립트를 작성하였습니다.

비슷한 경우에 있으신 분은 아래 스크립트를 참고하시기 바랍니다.

 

[상황]

메일을 받아서 다른 이메일 주소로 포워딩 해줘야 함.

하지만 사용자 홈디렉토리에 .forward 파일을 만들고 아래와 같이 사용했으나

포워딩 받은 이메일을 열어보니 메일 수신자가 변경되지 않고 그대로 쓰여있음이 확인됨 (sysdocu@sysdocu.com)

sysdocu@sysdocu.com // 사본을 남기기 위해 내 계정 입력

sysdocu@tistory.com    // 메일을 포워딩 받을 이메일 주소

 

[목표]

메일 발송 : A >>> B (포워딩) >>> C

메일을 포워딩 하고 받는 사람이 메일을 열었을때 '메일 정보'에서 송신자(A) 이메일 주소는 그대로, 수신자는 최종 수신자(C)의 메일 주소로 되어 있기를 희망

 

 

[방법]

icrontab 을 활용하여 /var/mail/sysdocu (메일함) 에 쓰기가 멈추었을때 저장된 메일을

쉘스크립트를 이용해 수신자를 편집하고 포워딩 해주면 됩니다.

여기서는 CentOS 기준으로 작성합니다. Ubuntu 환경에서 구성하는것은 별도 포스팅을 참고해주세요.

(https://sysdocu.tistory.com/1498)

 

메일이 쓰여진것을 확인하기 위해 파일 감지 패키지를 설치합니다.

# yum -y install incron

 

부팅시 자동 시작 설정과 현재 데몬을 구동합니다.

# systemctl enable incrond

# systemctl start incrond

 

파일 이벤트 (쓰기) 가 발생 되었을때 /root/run.sh 스크립트를 실행하도록 합니다.

한 통의 메일을 받더라도 IN_CLOSE_WRITE 이벤트가 빈번히 일어나므로 IN_ONESHOT 을 이용해 1회만 실행하도록 합니다.

나중에 스크립트에서 모든 처리가 완료되면 incrond 데몬을 재시작 하도록 했습니다.

# incrontab -e

/var/spool/mail/sysdocu    IN_CLOSE_WRITE,IN_ONESHOT    /root/run.sh

 

root 사용자의 incron 작업을 허용하고 적용해줍니다.

# vi /etc/incron.allow

root

 

# systemctl restart incrond

 

스크립트 내용을 작성합니다.

도착한 메일의 수신자를 수정하고 포워딩 하는 부분입니다.

그리고 메일이 쌓이면 쌓인만큼 여러개의 메일이 포워딩 되므로 포워딩 처리한 메일은 삭제해주는 것이 좋습니다.

 

# vi /root/run.sh

#!/bin/bash

date >> /root/result.txt
echo "스크립트 시작" >> /root/result.txt

# 쓰기 종료 확인시 진행
while : 
do

    # 메일 쓰기 종료 대기
    sleep 3

    # 시간 비교
    time_close=`stat -c %Y /var/spool/mail/sysdocu`
    time_now=`date +%s`
    time_diff=`expr $time_now - $time_close`

    # 메일 처리
    if [ "$time_diff" -gt "2" ]; then

        cat /var/spool/mail/sysdocu >> /root/sysdocu    # 백업
        sed -i "s/^To: .*$/To: sysdocu@tistory.com/" /var/spool/mail/sysdocu    # 수신자 변경
        cat /var/spool/mail/sysdocu |formail -s sendmail sysdocu@tistory.com    # 포워딩
        cat /dev/null > /var/spool/mail/sysdocu    # 비우기
        systemctl restart incrond    # 파일이벤트 준비 (IN_ONESHOT 때문에 재시작 필요)
        echo "메일 포워딩 완료" >> /root/result.txt    # 결과 기록
        echo "" >> /root/result.txt
        exit 0

    else
        echo "파일쓰기 종료 대기중" >> /root/result.txt
    fi

done

* /var/spool/mail/sysdocu : 사용자 이름의 메일함 (메일 파일)

* sysdocu@tistory.com : 넘겨받는 메일 계정

 

# chmod 700 /root/run.sh

 

이제 외부에서 sysdocu@sysdocu.com 로 메일을 보내면

sysdocu@tistory.com 이 받는것처럼 보여집니다.

 

반응형

댓글()