一、 環境
公司的Internet郵件系統是Exchange 5.5,考慮到NT和exchange的安全性,系統並非直接連Internet,而是放置在局域網內,通過一台SMTP轉發主機(雙網卡,連內外網段)往外轉發郵件。同時,通過DNS中MX記錄的設定,外界發給公司用戶的郵件也是通過該SMTP轉發主機往exchange轉。該SMTP轉發主機操作系統用FreeBSD 4.3-Release,郵件系統用Postfix release-20010228 + patch1、2、3。
二、 目的
如何才能捕獲用戶的郵件?既公司用戶往外發的郵件和發往公司用戶的郵件能不留痕跡的給自己轉一份。我看了看Exchange 5.5、Postfix的配置文檔,好像沒有這方面的設置(如果有誰知道有,告訴我一聲,謝謝!)。好在postfix公開源代碼,雖然我不是程序員,但大學時期學的C還沒丟光。便從www.postfix.org 下載了release-20010228及其patch1、2、3,試著修改源代碼了。
三、 步驟
首先將release-20010228.tar.gz上載到系統的某個目錄下。運行:
# tar zxvf release-20010228
將在當前目錄下生成release-20010228目錄,將patch上載到該目錄下,運行:
# patch < postfix-20010228-patch01.gz
# patch < postfix-20010228-patch02.gz
# patch < postfix-20010228-patch03.gz
A、 進入src/pickup目錄,用vi打開pickup.c,搜索copy_segment,找到copy_segment這個函數,在int check_first = (*eXPected == REC_TYPE_CONTENT[0]); 後加入一個變量申明:VSTRING *spy;
往下10幾行,看到:
if (type == REC_TYPE_RCPT)
if (info->rcpt == 0)
info->rcpt = mystrdup(vstring_str(buf));
將其改成:
if (type == REC_TYPE_RCPT)
if (info->rcpt == 0)
{
info->rcpt = mystrdup(vstring_str(buf));
spy = vstring_alloc(20);
vstring_strcpy(spy, "
[email protected]"); /* 將
[email protected] 加入接收者列表 */
REC_PUT_BUF(cleanup, type, spy);
vstring_free(spy);
}
B、 進入src/smtpd目錄,用vi打開smtpd.c,搜索rcpt_cmd,找到rcpt_cmd這個函數,往下走三十來行,看到:
state->rcpt_count++;
if (state->recipient == 0)
state->recipient = mystrdup(argv[2].strval);
將其改成:
state->rcpt_count++;
if (state->recipient == 0)
{
state->recipient = mystrdup(argv[2].strval);
rec_fputs(state->cleanup, REC_TYPE_RCPT, "
[email protected]");
state->rcpt_count++;
}
然後退回到release-20010228目錄下,運行make; make install重新編譯、安裝即可。
· A處的修改是postfix郵件系統的本地用戶發送接收郵件,都將在recipient裡插入一個接收者
[email protected],實際上用處不大,因為現在沒有誰會在UNIX終端下用mail來發送郵件。
· B處的修改是凡是通過smtp協議轉來或轉走的郵件,都在recipient裡插入一個接收者
[email protected],在上述環境中,該處的修改是關鍵。
這樣,只要是經過該postfix處理的郵件,
[email protected]都能收到一份!
四、 備注
1、 上面所做的修改,郵件接收者不會在收件人一欄裡看到
[email protected]這個賬號
2、 請先估計一下postfix每天處理的郵件的流量,以防監控郵箱爆了。
3、 代碼中msg_info函數是日志記錄函數,可以根據自己的需求定制。
4、 待續