在CentOS5中安裝Qmail商業郵件系統

希望本文對QMAIL和開源軟件的愛好者有幫助,也希望大家多提意見.      
只是QHPSI和Vqadmin部分尚未在商業環境中真正使用過, 因為這部分是剛剛加上去的.

其中關于垃圾掃描部分尚待改進,有些自動學習的腳本因為來不及整理所以沒有加入此手冊.

更糟糕的是還沒有用戶化的垃圾郵件管理界面,我正在尋求一個更好的方案,希望朋友們可以提供意見.      
===============================================================================
(1) 關于垃圾郵件的收集和學習
===============================================================================
SpamAssassin 利用Perl來進行文本分析, 如果發現郵件內容符合指定特徵則加以評分, 其
分數有高低和正負,評分愈高逾接近垃圾郵件的屬性定義, 若總計得分高於某項指定標準值,
則該郵件將被判定為垃圾郵件. 藉由概率統計的評分方式來定義垃圾郵件,這種判斷方式可
降低誤判的可能性.

SpamAssassin 使用 sa-learn 指令來學習新的垃圾郵件規則, 這個學習機制可對每封電郵
進行智能化分析, 抽取特征字段以便進行辨認. 為了降低誤認率,它會自動記憶每封已经被
過的邮件以防止重复读取. 執行學習指令可以非常簡單,只要選擇一個決定郵件性質的參數
(--ham或--spam),再指定所需學習的郵件路徑即可.

建議開設一個專門的郵箱帳號來收集垃圾郵件(如下假設此帳號是 abuse@test.com), 這個
信箱地址應該向該主機的所有用戶公開,以便收集用戶所報告的垃圾郵件. 作為系統管理者,
也可以把開設此帳號當作垃圾郵件投訴處理機制,并在官方指引中告訴用戶將垃圾郵件轉寄
到此信箱.

一旦設置好垃圾郵件的投訴政策和收集機制之後,剩下的問題就是如何處理所收集到的垃圾
郵件了. 如前所述, 所有用戶報告的垃圾郵件都將被轉寄到 abuse@test.com 這個郵箱,此
郵箱的路徑應該是在目錄: /home/vpopmail/domains/test.com/abuse/ 之中, 那么新收到
的垃圾郵件目錄就應該是: /home/vpopmail/domains/test.com/abuse/Maildir/new/ 目錄.

為了方便操作, 建議另外建立一個專門處理新垃圾郵件的系統目錄,將垃圾郵件從上述目錄
移動到此目錄,然后再針對此目錄來執行 sa-learn 學習指令, 等學習完成之后就刪除這些
垃圾電郵. 如果將這些命令編輯為一個 Shell 腳本, 設置成定時執行的任務, 那么就可以
讓 SpamAssassin 的學習系統定期自動更新其垃圾規則定義了. 請參考如下步驟:

vi /home/spamd/autoabuse.sh;
---------------------------------------------------------------------------------
mkdir /home/spamd/newspam;
mv /home/vpopmail/domains/test.com/abuse/Maildir/new/* /home/spamd/newspam/;
/usr/bin/sa-learn --spam /home/spamd/newspam/;
rm -f /home/spamd/newspam/*;
---------------------------------------------------------------------------------
chmod 755 /home/spamd/autoabuse.sh;

vi /etc/crontab;        #设置每隔十分鐘就自動學習一次:
---------------------------------------------------------------------------------
0-59/10 * * * * root /home/spamd/autoabuse.sh
---------------------------------------------------------------------------------
=================================================================================



=================================================================================
(2) 設置 qtrap 封鎖屏蔽腳本
=================================================================================
參考網址: http://www.qmailrocks.org/downloads/scripts/qtrap/

qtrap 是由 Eric Siegel 所編寫的一个shell脚本程序, 专门用于屏蔽和封鎖 qmail 系统的
垃圾邮件. 这个脚本比較簡單,可以從上述網址下載,把它放置到适当路徑下,并根據需要調整
掃描參數,然后針對特定的電郵域或郵箱帳號,修改其配置文件(.qmail-default),添加調用此
腳本的語句,使得進入該用戶郵箱的電郵,首先經過qtrap腳本的過濾操作.為了方便管理,建議
設置一個專門的路徑來處理封鎖屏蔽任務. 例如建立如下目錄:

mkdir -p /home/vpopmail/qtrap/logs;

如有需要, 可以修改qtrap腳本以適合您自己的封鎖要求, 也可以針對不同的用戶需求而建立
多個不同的封鎖腳本, 然后在各自的用戶配置文件中調用相應的封鎖腳本即可. 例如,預設的
腳本程序會掃描整個郵件內容,包括掃描郵件附件. 進行這種全文掃描不僅占用大量系統資源,
而且毫無意義. 因為按照本手冊所配置的Qmail郵件系統, 所有電郵文件在進入用戶信箱之前,
都必須先經過SpamAssassin的掃描, 而SpamAssassin會用指定的字符標記來記錄掃描結果,如
垃圾評分和級別等等.這些掃描結果將被添加到該郵件的Header內容里面,因此qtrap腳本其實
只需要掃描該郵件的Header內容就可以完成封鎖屏蔽的任務了. 請參考如下內容:

vi /home/vpopmail/qtrap/qtrap-block-spam.sh;        #如下內容省略注釋部分;
---------------------------------------------------------------------------------
#!/bin/sh

# ....................
# ... 忽略注釋說明 ...
# ....................

#The whitelist configuration block

whitelist_check () {
case $WHITELIST in
address@somewhere.com|address@somewhereelse.com)
echo $SENDER found in whitelist on `date "+%D %H:%M:%S"` >> /home/vpopmail/qtrap/logs/qtrap.log
exit 0;;
  *)
   ;;
  esac
}

# The banned word list configuration block
# checkall() 函数按指定關鍵字来判断過濾內容是否符合**条件,這里所指定的關鍵字
# 是"+++++SPAM+++++"(請參考本手冊第12節的內容).為了詳細記錄封鎖日志,還特別添加
# 了两个参数: $RECIPIENT 和 $HOST

checkall () {
case $BANNED_WORDS in
+++++SPAM+++++|+++++SPAM+++++)
   echo MESSAGE DROPPED from $SENDER to $RECIPIENT because of $BANNED_WORDS on `date "+%D %H:%M:%S"` >> /home/vpopmail/qtrap/logs/qtrap-$HOST.log
   exit 99;;
  *)
   ;;
  esac
}


#Do not edit below here

WHITECHECK=$SENDER
for WHITELIST in $WHITECHECK
do
whitelist_check $WHITELIST
done

# 下面主程序修改了變量CONTENT的提取內容,原先的腳本是CONTENT=`(cat)`,即提取整封
# 郵件內容,甚至包括附件內容.現在改為用grep函數來過濾內容,只包含標題Subject部分.

CONTENT=`(grep "Subject: +++++SPAM+++++" | head -n 1 | awk -F: '{print $2}')`
for BANNED_WORDS in $CONTENT
do
checkall $BANNED_WORDS
done
exit 0
---------------------------------------------------------------------------------
chmod 755 /home/vpopmail/qtrap/qtrap-block-spam.sh;        #設置執行權限;


一個可以簡化處理的腳本:

因為在本手冊前面部分的配置步驟中, 采用了重寫標題的方法來標記垃圾郵件(參考第12節).
所有被SpamAssassin確認為垃圾郵件的郵件, 都將在標題前附加上 "+++++SPAM+++++" 字符.
可以將標題 Subject 中包含 "+++++SPAM+++++" 字符的郵件直接屏蔽封鎖,因此上述腳本又
可以進一步簡化成如下:

vi /home/vpopmail/qtrap/qtrap-clean-spam.sh;        #如下內容省略注釋部分;
---------------------------------------------------------------------------------
cleanall () {
   echo MESSAGE DROPPED from $SENDER to $RECIPIENT because of $BANNED_WORDS on `date "+%D %H:%M:%S"` >> /home/vpopmail/qtrap/logs/qtrap-$HOST.log
   exit 99
}

CONTENT=`(grep "Subject: +++++SPAM+++++" | head -n 1 | awk -F: '{print $2}')`
for BANNED_WORDS in $CONTENT
do
cleanall $BANNED_WORDS
done
exit 0
---------------------------------------------------------------------------------
chmod 755 /home/vpopmail/qtrap/qtrap-clean-spam.sh;        #設置執行權限;
=================================================================================



=================================================================================
(3) 在用戶配置文件中調用屏蔽腳本
=================================================================================
被qtrap的過濾規則屏蔽而遭到封鎖的郵件將被直接丟棄,也就是說用戶將完全接收不到這些
被丟棄的電郵. 假如某用戶的一封正常電郵被誤認為垃圾郵件, 那么這封電郵就可能被屏蔽
腳本直接刪除,而不會再投遞到該用戶的任何信箱目錄,哪怕是該用戶開設了垃圾信箱也沒用.
顯然使用這種屏蔽功能有丟失誤認郵件的風險,因此這也就意味著在商業郵件系統中,要執行
屏蔽動作就必須先經過適當的授權程序.

設置好的封鎖腳本不會自動執行屏蔽動作, 必須先由用戶提出封鎖要求, 然后由系統管理員
修改該用戶的配置文件. 設置一個電郵域或用戶郵箱啟用封鎖腳本的方法很簡單, 只須在其
相應的配置文件首行調用此腳本即可.


【例1】全域用戶的屏蔽封鎖:

vi /home/vpopmail/domains/test.com/.qmail-default;
---------------------------------------------------------------------------------
| /home/vpopmail/qtrap/qtrap-block-spam.sh
---------------------------------------------------------------------------------
請注意: 在上述配置文件的最前面增加單獨的一行, 那么所有進入test.com的電郵都會首先
經過 qtrap-block-spam.sh 腳本的過濾操作.


【例2】單獨用戶的屏蔽封鎖:

如果只需要單獨設置某個郵箱用戶的封鎖動作,而不想影響其他用戶,則需要修改該郵箱用戶
的配置文件(.qmail), 設置首行調用qtrap腳本. 例如要屏蔽所有進入郵箱 user1@test.com
的垃圾郵件, 可以新建或編輯如下配置文件:

vi /home/vpopmail/domains/test.com/user1/.qmail;
---------------------------------------------------------------------------------
| /home/vpopmail/qtrap/qtrap-block-spam.sh
---------------------------------------------------------------------------------
請注意: 在上述配置文件的最前面增加單獨的一行, 那么所有進入user@test.com的電郵都會
首先經過 qtrap-block-spam.sh 腳本的過濾操作.


【例3】別名轉寄的屏蔽封鎖:

別名用戶也可以做同樣的屏蔽設置, 只需要在別名設置文件的首行調用封鎖腳本,就可以防止
垃圾郵件通過別名帳號轉寄. 例如, 如果要屏蔽所有通過別名郵箱 alias1@test.com 轉寄的
垃圾郵件, 可以編輯如下配置文件:

vi /home/vpopmail/domains/test.com/.qmail-alias1;
---------------------------------------------------------------------------------
| /home/vpopmail/qtrap/qtrap-block-spam.sh
---------------------------------------------------------------------------------
請注意: 在上述配置文件的最前面增加單獨的一行, 那么所有通過 alias1@test.com 轉寄的
電郵都會首先經過 qtrap-block-spam.sh 腳本的過濾操作.


警告: 添加調用封鎖腳本的語句之前,一定要首先檢查您的郵件系統, 確認已經設置好該語句
所調用的qtrap腳本, 如果上述配置文件中的 qtrap-block-spam.sh 路徑不正確,或者該腳本
程序本身有問題, 那么就可能會導致相關用戶無法接收到任何電郵.
=================================================================================      
如果早看到这篇文章我能少走很多弯路。多谢楼主。

现在关于qmail的配置文档都是03,04年留下的,很多软件升级无论编译还是配置就改变了。楼主这篇文章真及时。

现在正在配qmail刚配好,发现qmail-scanner调用spam扫到垃圾邮件却不修改标题。看楼主是直接修改pl,在没看到楼主的文章正为此抓狂类。后来到qmail-scanner的官网去看FQA也找到了答案:
17. I want "fast_spamassassin" for performance - but I want the Subject: header tagged as "SPAM" too! Boy - you don't want much do you!  Anyway - you can. Simply change the "--scanner" option to "fast_spamassassin=STRING" and "STRING" ("SPAM:" is a good value) will be prepended to the Subject line of every message marked as Spam. If you want all that cool extra detail from SA (e.g. the reasons for a particular score), then there is no option but to use "verbose_spamassassin"

在编译qmail-scanner的时候在"--scanner fast_spamassassin=STRING“ 就可以直接把STRING变成标记垃圾邮件的字符。

多谢楼主      
厉害!
太多了!
能简单化就好了!      
本帖中出现的无意义的回复已清理!

.      
很好!
开源社区是天堂!      
楼主辛苦了~
整理出这么有条理的资源不容易呀!      
谢楼主的无私!我正准备照着做一下!但是有一个问题,不知能否使用DDNS的域名!