ADJ網路實驗室
打印

[技巧] Sendmail 下對所有寄出與寄進的信件存檔備份

Sendmail 下對所有寄出與寄進的信件存檔備份

Question?
Sendmail 有沒有辦法這樣做,例如業務發一封信出去,sendmail會自動送給我的帳號呢?就是檢查mail的意思,我知寄進來的可以轉送多個人,但是user寄mail出去我該如何設才能收到他寄給誰呢?

此篇文章是參考自龍門少尉的窩
這邊以 RH 7.3 and sendmail 8.11.6 來說明...實做之後確實跟 Postfix 的功能差不多...只是比較麻煩而以...


步驟一:
產生負責備份的程式

1.如果你的系統上已經安裝好了 gcc 等相關套件(安裝 Linux 時已選擇了 Kernel 或 Software Developement 時會自動安裝),也可以把 milter.tbz2 取回, 在你所習慣的工作目錄下解開,執行 make install 即會把 filter 程式檔安裝在 /usr/sbin 下。
Download:milter.tbz2

註: 有關 milter.tgz 的說明
取自於 sendmail 的原始程式碼套件。
filter.c 取自於 原始程式碼套件中 libmilter/README 檔所附的範例。 唯原範例把信件備份於 /tmp,筆者修改路徑為 /var/spool/mail.backup。

2.修改 /etc/mail/sendmail.mc,(在檔尾)加入
複製內容到剪貼板
代碼:
define(`_FFR_MILTER')dnl
INPUT_MAIL_FILTER(`sample',`S=local:/var/run/filter.sock')dnl
3.在 /etc/mail 下執行
#m4 sendmail.mc > /etc/sendmail.cf

4.先將 /etc/init.d/sendmail 備份,再修改該檔...
  a. vi /etc/init.d/sendmail 先找到以下這一段..
複製內容到剪貼板
代碼:
start() {
        # Start daemons.

        echo -n $"Starting $prog: "
在其後加上
複製內容到剪貼板
代碼:
rm -f /var/run/filter.sock
/usr/sbin/filter -p local:/var/run/filter.sock &
echo $! > /var/run/filter.pid
sleep 3
chmod go-rwx /var/run/filter.sock
b. 再先找到以下這一段...
複製內容到剪貼板
代碼:
stop() {
       # Stop daemons.
       echo -n $"Shutting down $prog: "
       killproc sendmail
       RETVAL=$?
       echo
       [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sendmail
在其後加上
複製內容到剪貼板
代碼:
[ -f /var/run/filter.pid ] && {
        kill -KILL `cat /var/run/filter.pid`
        rm -f /var/run/filter.sock
       }
5.執行
  # mkdir /var/spool/mail.backup
以建立 /var/spool/mail.backup 這個目錄。

6.執行 service sendmail restart 重新啟動 sendmail...


步驟二:
把 sendmail 備份起來的信件按日期儲存在對應的目錄內


只要每天定期執行以下的 script,筆者把它取名為 move_backup_mail,它會把前一天的信件儲存在 /var/spool/mail.backup 下對應的目錄。例如今天是 2002 年 3 月 12 日,該 script 會先建立 /var/spool/mail.backup/20020311,然後把所有 2002 年 3 月 11 日的信件搬到該目錄內。

1. vi /usr/sbin/move_backup_mail
Script 內容如下:
複製內容到剪貼板
代碼:
#!/bin/bash
TODAY=`date +%Y%m%d`
cd /var/spool/mail.backup
touch -t ${TODAY}0000 dummy
DATE=`date --date=yesterday '+%Y%m%d'`
mkdir ${DATE}
find . -name 'msg.*' -type f ! -newer dummy -maxdepth 1 -exec mv {} ${DATE} \;
2.執行
# chmod 700 /usr/sbin/move_backup_mail
設定適當權限。

3.可以以 root 身份執行 crontab,加入以下內容,以 設定每日零時五分自動執行...
複製內容到剪貼板
代碼:
5 0 * * * /usr/sbin/move_backup_mail

步驟三:
如何閱讀備份的郵件


若要閱讀一份檔名為 msg.XXYYZZ 的備份郵件,請利用以下的步驟,把該信件寄到你的 e-mail 信箱(如 adj , 或 adj@adj.xxx.www 等):
複製內容到剪貼板
代碼:
sendmail adj < msg.XXYYZZ
如果要一次把目錄內所有的備份信件(檔名為 msg 為首者)寄到 adj 這個帳號,則可用(在 bash 下):
複製內容到剪貼板
代碼:
for file in /var/spool/mail.backup/msg.*
do /usr/sbin/sendmail adj < $file
done
那如果你想要信件寄出來之後就砍掉的話...可以在最後面加上一行...
複製內容到剪貼板
代碼:
for file in /var/spool/mail.backup/msg.*
do /usr/sbin/sendmail adj < $file
done
/bin/rm -f /var/spool/mail.backup/msg.*
這樣就可以不保留信件囉...

整個步驟做完之後...就可以達到 Sendmail 下對所有寄出與寄進的信件存檔備份...現在才知道可以這樣做...如果不考慮道德面的情況下...有興趣的人倒是可以Try 看看啦...





TOP

ARTERY.cn