Chinaunix

标题: SpamAssassin的中文垃圾邮件过滤规则集 [打印本页]

作者: bhuang    时间: 2004-09-23 12:35
标题: SpamAssassin的中文垃圾邮件过滤规则集
CCERT于2004年9月7日推出了第一个开放式中文垃圾邮件过滤规则集(参见:
http://www.ccert.edu.cn/spam/sa/Chinese_rules.cf),用于业界广泛
使用的免费垃圾邮件过滤系统SpamAssassin,对于中文垃圾邮件的过滤起到很好的效果,在业界引起了广泛关注。
  
    SpamAssassin 是目前最为广泛的免费反垃圾邮件系统,拥有超过3000万用户(邮件服务器)。但是,由于以前没有中文的过滤规则集,SpamAssassin 对中文邮件过滤的准确性不高。CCERT反垃圾邮件研究小组在陈光英博士的带领下,推出了中国第一个基于SpamAssassin的中文垃圾邮件过滤规则集,该规则集从CCERT垃圾邮件投诉信箱中提取大量垃圾邮件样本,利用统计方法和遗传算法来训练和优化每条规则的权重,过滤的准确率超过了99%。利用CCERT所掌握的丰富的样本数据,该规则集目前每周更新一次,时效性很好。

    该规则集是目前在SpamAssassin 官方网站上发布的唯一一个中文垃圾邮件过滤规则集(参见 :http://wiki.apache.org/spamassassin/CustomRulesets),也是用google搜索能够找到的唯一一个中文过滤规则集,自从在网络上发布以来,引起
了较大的反响。
作者: abel    时间: 2004-09-23 12:52
标题: SpamAssassin的中文垃圾邮件过滤规则集
自己寫一套,還比較好:
http://211.72.210.251/spamcop.html

那個東西無法解決 QP/Base64 encoding 吧..
而且我寫的可以做到 summary 統計等,全部用 procmail+mysql 來實現
User 都可以從網頁自訂 Filter rule (Patten,RBL,White List...),且完全將信件的 encoding 解碼
核心的 procmailrc 只有 100 行程式
被檔的信件不會到 User 信箱,但每天會給 user Block list
User 只要在 Block List( EMAIL notify) 點一下就可以取回來了
而且,我們還養 spamcop.net 這個 RBL, 你可以看到最下面的地方有一個
Submit, 可以自動將這份 List 發給 RBL 組織,再自動 submit RBL 的
commit , 個人認為再也不能做得更好了(或有限) ...
作者: flyapollo    时间: 2004-09-24 16:43
标题: SpamAssassin的中文垃圾邮件过滤规则集
原帖由 "abel" 发表:
自己寫一套,還比較好:
http://211.72.210.251/spamcop.html

那個東西無法解決 QP/Base64 encoding 吧..
而且我寫的可以做到 summary 統計等,全部用 procmail+mysql 來實現
User 都可以從網頁自訂 Filter rule ..........


兄弟能不能share一下啊
作者: abel    时间: 2004-09-24 16:50
标题: SpamAssassin的中文垃圾邮件过滤规则集
講個主題吧...
不然光 procmailrc 語法就死一堆人...
自動 submit spamcop 也是
中文解碼還原也是 ...
...
因為若沒有根基,就沒有荿盛的葉子呀 ...

我一天會收到平均三百封 spam, 自完成這個後, 95% 以上的 spam
都可以被檔下來,誤檔率也不到 1%,且也有充份的補救措施,
可以再從 mail server 自動取回來
作者: hzqbbc    时间: 2004-09-24 17:11
标题: SpamAssassin的中文垃圾邮件过滤规则集
原帖由 "abel" 发表:
自己寫一套,還比較好:
http://211.72.210.251/spamcop.html

那個東西無法解決 QP/Base64 encoding 吧..
而且我寫的可以做到 summary 統計等,全部用 procmail+mysql 來實現
User 都可以從網頁自訂 Filter rule ..........


amavisd-new配合SA可以做到QP/base64 decode..因此原则上没有问题的。。至于说垃圾邮件的digest,不知道abel兄台是怎么设计的?

是每封信到达时检测看新信笺够了n封后再发digest还是。。?愿闻其详。
作者: abel    时间: 2004-09-24 19:57
标题: SpamAssassin的中文垃圾邮件过滤规则集
amavisd-new配合SA可以做到QP/base64 decode..因此原则上没有问题的。。至于说垃圾邮件的digest,不知道abel兄台是怎么设计的?

是每封信到达时检测看新信笺够了n封后再发digest还是。。?愿闻其详。

hzqbbc 兄,您的 pm 我就不回了,我想大家在這個串裏討論即可,也方便後
進可以看看大家的推演,只有我們兩個用 email 討論的話,大概其他人也
不會受益 ...

我們不是做 Mail Server 或 Anti-Spam 的,研究這些東西主要只是為了給
我們這種三十人的小單位使用,以練練自己技術, amavisd-new 是好東西,但
是和某些 MTA 搭配時,尤其是 sendmail 會有 "Lost input" 問題,至於 SA
,有人說吃 Resource 很凶...並不是說這些東西好或不好,但站在個人角度
或公司立場,我們是希望自己有一套方法來 anti-spam/anti-virus,而
anti-spam 是 User 自己決定做不做, anti-virus 站在公司角度來說是一定
要執行的,所以切合自己的需要是最重要的.

anti-virus 很簡單,用 procmailrc 常用的語法及公司政策就可以全部打死
政策就是:拒收所有的可執行檔,像 .com .pif .js ...都擋掉,並教育 user
觀念,因為我們人少,流動率低,所以三年來從沒有人中過什麼 email virus,
個人認為從政策面入手,再由技術面配合, anti-virus 實在不用什麼技巧

anti-spam 就不同了,我個人一天有400~500 封的信件,其中九成是 Spam,XD~
不擋怎受得了, SA 的作法符合大家的需求,所以很多人都用,但是 SA 並不能
滿足我們,尤其是 Forward 的信件或網頁或 mailing-list 常會誤判,甚至我
們請商業公司給我們適用一些產品,像 eShield 等,結果也是亂七八糟,判對
了就算了,判錯了你還給我加一堆 header 或是改 Subject: SPAM-xxxx, 造
成回信的困擾

anti-spam 最多人用的技術不外乎是 RBL,網路上隨便抄都有各種 MTA 設定的
Sample,不過講實在話,我相信 99.99% 人永遠不知道 Connection 就被 RBL
設定 Reject 的信有多少,到底是真 Spam 還是重要信件你也很難檢驗.個人的態
度則不然,既然我自己要寫符合公司使用的 anti-spam ,我就得做實驗,我用
我的 EMAIL account 做了一項測試,每封收進來的信由 procmail 來判讀,並計
數統計,做成像
http://www.sdsc.edu/~jeff/spam/Blacklists_Compared.html
的比較表,找出最符合我們特性的 RBL ,當然,不只計數如此而以,你還得看該
RBL 準確度,該 RBL 的運作機制等(例如檢舉/移除/可靠度..),最後找出三個
來使用(使用過多的 RBL 一點意義都沒有),有些 RBL 只是敵視某些國家或 ISP
等,其實這都不值得使用的.

我使用 procmail 來做上述的一些檢測,當然技術層面一定要夠了才做得了,
當然,我也可以使用 procmail 來做寄出/寄入的條件性備份(我是 sendmail 派的),
只是,講實在話,我看這裏的人大多都只重表面,不重實際,只要文檔,不要原理,只要
結果,不思過程,當然也有些非常重實際的人,像您一般.
我三年前,我學 procmail 相關的運用,可是花了整整一個星期,我看遍 manpage
相關的說明 (procmail/formail/procmailrc/procmailex/procmailsx..),
各大小相關的 procmail 網站都逛過,基本上這些都是做過不斷的實驗與實作,
所累積下來的經驗,即使我貼出來我的做法,我想以這個版的風氣,大概就是
"怎麼不行/mysql 連不到/我要怎麼自己加 Patten/CGI 不 Work/
Http 500 Internal Error" , XD~ ,這個版上也從沒有一篇有關 procmail
像樣的說明...,我看到的精華區幾篇關於 procmail 感覺都只是抄過來的而以

當然, procmail 如同 SA 一般給人的感覺都是吃資源,這是多數人的感覺,
一則以我們單位不大,二則以掌握度高,三則以 LDA 為 filter 對像,其實
在我們來看,並不會佔用太多 Mail Server Resource

我的個人觀點, anti-spam ,你就要懂 Mail Server, SPAM 原理,Mail Format/
Encoding 等相關東西,不然就用人家寫好的就好,實在沒必要自己做這種苦力
---------------------------------------------------------------------

以上只是個人一些在這版看到的一些感想,言歸正傳

amavisd-new配合SA可以做到QP/base64 decode..因此原则上没有问题的。。至于说垃圾邮件的digest,不知道abel兄台是怎么设计的?

是每封信到达时检测看新信笺够了n封后再发digest还是。。?愿闻其详。


hzqbbc 兄問得應該是我怎麼做的原理吧~我就只用 procmail 來做而以,procmail
這個東西在許多 MTA 上都是預設的 LDA,所以 postfix 應也是一樣做法,只是我專
走 sendmail 的研究,而版上諸友看來都是 Qmail.

procmail 收到信後往 local deliver 送時,自然會讀 $HOME/.procmailrc 是否存在,
所以,我只要把 .procmailrc 丟到該 USER 的 $HOME 下,過濾機制自然對他生效,
每封信進來就會判斷,儘量不要把 procmailrc 設在 /etc 下,因為那會對整個 MTA
生效,我做過實驗,你每個 USER 放一個 .procmailrc ,和放 /etc/procmailrc ,其
實對系統的 Loading 差很多,尤其是在一封信寄給很多人的情形,如果一封信寄到
一個 aliases, 裏面有 10 個 account , 在 /etc 下, procmail 會跑 100 次,
而 $HOME 下只會有十次, 最好的方式像 amavisd-new/Mail-Scanner 則只會做一次
當然,這是他們在進信的過程中所處的位置不同所造成的差異...(您應看得懂,其他
大概九成的人不懂).

所以,信件判斷,照多數人只看中文教學的人來說,大概只會做:

  1. #procmailrc sample1,符合 domain.net 來信的要過濾掉
  2. :0 H
  3. * ^From: .*domain.net.*
  4. /path/to/save

  5. # 進來的信件要複製轉寄一份給 other_server_email@domain
  6. :0c
  7. ! other_server_email@domain

  8. # 高明一點知道如何避免 Loop
  9. :0c
  10. * ! ^Have-Filter: 1
  11. | formail -A "Have-Filter: 1" | sendmail -oi -t email
复制代码


好了,現在我們看到,信轉走了,或丟到別的位置去了,這都是大家從別人的 sample 學來的
但是有沒有發現 可以 pipe (|) 給一隻程式處理,這裏我們只要做一些手腳,就可以那來
做很多事了(其實像上面例子的 From: 就可以是程式)
我們可以來美化一下:

  1. # MYSQL 變數就是你拿來存 spam info 的連接參數
  2. MYSQL="mysql -u username -ppassword -h hostname dbname"
  3. # 取出誰寄給你信
  4. FROM=`formail -zxFrom:| sed -e 's/.*<\(.*\)>;.*/\1/g'`
  5. # 取一個檔名來歸信件檔
  6. FILE=`echo $HOME`/procmail/mail_folder/mail-`echo $$`-`date +%Y%m%d%H%I%S`.eml
  7. # 將每個人的信件單獨存成一個檔案
  8. tmp=`formail >; $FILE`
  9. # 取出主旨列內容,主旨列可能是 8bit,或是有 charset, 或是有 QP 編碼及 MIME BASE64 編碼等情形
  10. tmp=`formail -zxSubject:`
  11. # 一個自己寫的簡單解碼程式,將編碼還原成 Big5
  12. SUBJ=`/etc/parser_subj "$tmp"|sed -e 's/ //g'`

  13. # flag HD 或下面的 fw 自己 manpage 吧
  14. # 儘量少用 小寫 h,因為會濾掉 header,不過大概沒有人看得懂這句話
  15. :0 HD
  16. * (^From:|^Received:|Return-Path:) .*(mailserver.idv.tw|mailserver.com|worldad.net|mailnews.com.tw).*
  17. {
  18.         :0 fw
  19.         | echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM','$TO','$SUBJ','$FILE',1,'$LOGNAME','發信軟體','mailserver 信商發出')"    | $MYSQL

  20.         :0
  21.         /dev/null
  22. }
复制代码


好了,如此我們即可判斷出 (From 或 Reveived 或 Return-Path) 有 (mailserver.idv.tw 或 mailserver.....)
的信,要導給一個程式做處理,這個程式只是將必要資訊存入 mysql 中

最後,信件存入 /dev/null (就是殺掉了)

再來看一個我的範例:

  1. :0 hD
  2. * ! ^From: .*mydomain.net.tw.*
  3. {
  4.         :0 fh
  5. # 取出的 $SUBJ 和資料庫中的該 USER 定義的中文字做比對
  6.         | ( patten=`echo "select concat(PATTEN,\" \") from SPAM_PATTEN where USERNAME='$LOGNAME' and instr('$SUBJ',PATTEN)"|$MYSQL      | grep -v 'PATTEN'`; \
  7. # 比對結果長度不為0,表示 Match
  8.         if [ ${#patten} -ne 0 ] ; \
  9. # 在信件加一個表頭欄位, Spam: 符合的字串項目
  10.                 then    formail -A "Spam: $patten";     \
  11. # 把資訊寫入 mysql 中
  12.                 echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM','$TO','$SUBJ','$FILE',1,'$LOGNAME','符合特定字串','$patten')" | $MYSQL;       \
  13. # 把該 PATTEN 計數加一,有可能一封信符合多個 PATTEN, 每個都要加一,所以要用 for loop 處理
  14.                 for p in $patten;do        \
  15.                         echo "update SPAM_PATTEN set CNT=CNT+1 where USERNAME='$LOGNAME' and PATTEN='$p'| $MYSQL;        \
  16.                 done;        \
  17.         fi );

  18.         :0
  19.         * ^Spam: .*
  20.         /dev/null
  21. }
复制代码


上述的 # 註解不應該存在那裏,只是為了方便大家看而加,不然程式為出錯

好了,大柢原則就是這樣做而以,你要怎麼 coding 看你的能力而以, 為什麼要 ; \ 懂
shell 的人一定知道,這個過程中,我們將所有資訊都存入 $FILE 及 mysql 中,
再來就只要按時 run 一個 cronjob , 把 summary 送給 user 即可,不是嗎 !?
只是這個 cronjob 送出來的是 html 的信件, user 只要在這個 summary report
上,像你看到的 http://211.72.210.251/spamcop.html 看到的例子上點主旨列
就可以取回信件,就跟網頁的做法是一樣的.

註: 取回的信件不是又進了過濾條件,怎麼取得回來呢 !? 有時間再和大家分曉吧
有興趣的人先去消化一下,沒想到這點的人你就不要關心這個主題了.
作者: hzqbbc    时间: 2004-09-25 23:01
标题: SpamAssassin的中文垃圾邮件过滤规则集
原帖由 "abel" 发表:
......amavisd-new 是好東西,但
是和某些 MTA 搭配時,尤其是 sendmail 會有 "Lost input" 問題,至於 SA
,有人說吃 Resource 很凶...並不是說這些東西好或不好,但站在個人角度
或公司立場,我們是希望自己有一套方法來 anti-spam/anti-virus,而
anti-spam 是 User 自己決定做不做, anti-virus 站在公司角度來說是一定
要執行的,所以切合自己的需要是最重要的. ......


amavisd-new应该有一个sendmail的helper programe的。但我基本不玩sendmail,所以也不好说这个helper是否有用。SA吃资源是挺厉害的,全文过滤+进行n多的过滤规则test,感觉有点恐怖。。

......SA 的作法符合大家的需求,所以很多人都用,但是 SA 並不能
滿足我們,尤其是 Forward 的信件或網頁或 mailing-list 常會誤判,甚至我
們請商業公司給我們適用一些產品,像 eShield 等,結果也是亂七八糟,判對
了就算了,判錯了你還給我加一堆 header 或是改 Subject: SPAM-xxxx, 造
成回信的困擾......


对于forward的信件,这个真的就不好判断是否垃圾信了,所以还必须有机制使用户可以将一些被判为spam的信从junk mailbox里取出来放回inbox的。至于说改subject,这个大可以屏蔽掉的。 :em11:  

......anti-spam 最多人用的技術不外乎是 RBL,網路上隨便抄都有各種 MTA 設定的 Sample,不過講實在話,我相信 99.99% 人永遠不知道 Connection 就被 RBL 設定 Reject 的信有多少,到底是真 Spam 還是重要信件你也很難檢驗.個人的態 度則不然,既然我自己要寫符合公司使用的 anti-spam ,我就得做實驗,我用我的 EMAIL account 做了一項測試,每封收進來的信由 procmail 來判讀,並計 數統計,做成像.....當然,不只計數如此而以,你還得看該 RBL 準確度,該 RBL 的運作機制等(例如檢舉/移除/可靠度..),最後找出三個
來使用(使用過多的 RBL 一點意義都沒有),有些 RBL 只是敵視某些國家或 ISP
等,其實這都不值得使用的. ......


RBL是个又让人爱又让人恨的东西,可以考虑在SA里加相应规则,如果被某些rbl列进去后,则加相应的分数,如果是百名单里的ip则减掉相应的分数等,而不要简单的reject,可能会好一些。

至于ip层的检测,我修改了一下SPF设计了MSBL,可以在一定程度上解决或缓解RBL的问题,配合APS则可以较好的处理spam邮件。。目前的情况是95%或者99%(我自己的mailbox就是99%的垃圾都可以block掉)以上的spam可以blocked掉。关键还是综合多种方法。

关于abel兄提到学procmail的经历,我深有同感,任何一个工具,即便只是使用,要深刻应用也要大量的精力和试验。需要的知识更是一点一点积累而非一日之功。至于说cu上关于procmail没有一篇好文,我觉得也不足为奇,毕竟我们还是很缺乏刻苦钻研+无私奉贤精神嘛


至于说到procmailrc及.porocmail在遇到aliases时的执行次数,我倒不太明白为何procmailrc会被执行100次呢??因为我使用的是maildrop,其不支持aliaes。。请赐教了

......註: 取回的信件不是又進了過濾條件,怎麼取得回來呢 !? 有時間再和大家分曉吧
有興趣的人先去消化一下,沒想到這點的人你就不要關心這個主題了.


我猜大概是在判别信件为spam时已打了一个标记,如果取信时进入过滤条件,一旦发现这个标记,则ignore之。不知道是不是呢?如果是我设计,首先想到的就是这个方法,打标签的方法。

最后,非常佩服abel兄将procmail用得如此娴熟,确实让偶增长见识了:)换成我的话,我大概又得写点程序来做,而不是利用mda本身的特性完成了。
作者: hzqbbc    时间: 2004-09-26 10:01
标题: SpamAssassin的中文垃圾邮件过滤规则集
原帖由 "abel" 发表:

SPF 還好,但若不能有重大突破,早晚會失敗, Domain Key 多少也存在許多現實問題 ..
MSBL Subject 過濾法,我們即有使用, MATCH 即 Block,是你 User 自己設的哦,所以
     被檔了,自己去 Block List 找回來
APS 就?.........


看来abel兄弟在procmail及email等方面,比较早期就开始研究了。procmail以前一直都没仔细去研究,因为我要实现的东西和您的有点不同,您是面对小型email系统,可以使用unix account,而我要实现的是产品化的东西,主要是以virtual user(用户信息放在db而不是passwd文件里)为主。

所以走的路线是有点不同,MDA及LDA我使用的是maildrop,主要是我更习惯maildrop的语法,因此做法就有些不同而已。

客观的说,abel兄设计的整个思路很好,主要是友好的界面及丰富的设定,但对于运营级的email server,我认为机器资源有点吃紧,因为每封信都会和db有关联操作,而且还会生成spam的流量图等...

但没有实际测试过前,这样决断还是有点武断的了。

......註:我用 rrdtool 做的,但中文化也是自己K了他三天程式寫出來的,我寫出來時,mailscanner-mrtg
也還沒問世...

當然,要滙整全公司或某部間狀況,只要資料庫對 "人"和 "信" 的定義很清楚,都可
以很簡單做出來. 總結即是,你要能做到 Filter 結果存起來另外使用即可,不用每
個巳被判為 Spam/Virus 還寄到 User 信箱.


喝彩!我是2年多前才接触到rrdtool的。只是当时是用mrtg做图,显不了中文文字,只是没有去改代码解决问题,对比之下在下很惭愧

另外,关于spam的处理方法,我使用了和abel兄有点不同的办法,被判决为spam的邮件放到用户mailbox的一个特定目录里,junk mailbox里。这样就不必花力气做digest了。用户浏览这个目录就可以看到哪些信是被误判的,发现后移动到inbox就可以了。

当然,我这是有点偷懒的做法。做digest感觉更好一些。

关于SPF,我认为只是一种anti-spam的补充,对此褒贬不一,我认为在相当一段时间内还是比较有效的。当然,必须综合多种判决才比较合理。
作者: abel    时间: 2004-09-27 03:32
标题: SpamAssassin的中文垃圾邮件过滤规则集
hzqbbc 兄客氣了,
確實,scale 影響整個 Mail 架構及格局,我在做的時候只以公司考量為出發點,但精神應都差不多,
至於 Unix Auth 問題,對於那些知識若只從書本來的人而言,確實在您的考量下不易實現, Sendmail
實現 username@domain 做法可參考 :
http://www.reedmedia.net/software/virtualmail-pop3d/#delivery
至於 Sendmail 帳號認證從 DB 來:
http://bbs.chinaunix.net/forum/viewtopic.php?t=411834&highlight=abel
第一個 link 做法我沒有去試過,但看來沒有什麼困難處,而第二個 link, 我們現在就在用
(當然,他沒有給我加精我覺得很奇怪,我不想加精的東西反而給我加了,我覺得這一篇文章我把許多
CU 人很少碰到的地方講解的很明白了呀,也或許依然還是太深奧了,還是我太膚淺了~)
,其實,像我們這種單位,機器數量(Public Service Host) 遠比員工數量多上許多,且又分散於各
ISP 之 IDC 機房,我們本即會考慮 User DB 化及集中化管理之顧慮,至於 login account 和
email account 的分離,用 PAM 技巧即可做到,不會有什麼困擾處(當然,個人覺得這很簡單,我
相信 hzqbbc 兄必看的懂的,至於其他朋友可能看造化了)

每封信都会和db有关联操作,而且还会生成spam的流量图等...

嗯,其實這種只要是 User Customize 空間很大的東西,都會有這個問題,我也可以用檔案實現,但其實狀況
都差不多,除非 User 不可 Customize , 就可以事先 Load 進 Memory 中處理,因為很多東西你得到 LDA
階段才知道這個人現在設了什麼 rule, 你把他先 load 進來巳是沒意義了,我的方法唯一的缺點是用了太多
外部程式或 Shell 技法,這對大量的信件時容易造成 shell fork 太多問題,不過目前來看,三十人單位,日信
件流量約 10000~20000 封,尚無太大影響:

註1:上面的高峰值是由 imap client 產生,我們給 30G 不 quota 的空間收 mail , 所以有很多人的信都超過 1G
註2: Mail Server 最近換過主機,所以我只畫換過後的資料,主要是原空間不夠及改用 LVM
註3: 這台機器還兼做網管,用 mrtg 的 target 觀念來看,超過500 個項目,只是平常只 Collect/Alert
     但不 graph, Broswer 時才 graph.  

所以 spam 的 report 我們平時是不畫的,所以 Resource 的使用壓力應還好, ,User 選擇要看 Report 時才動
態產生,而產生的語法也不需要 RRD FILE ,因為我把 RRDTOOL 中之 RRDFILE 資料庫化,直接可以從 TABLE 中讀
出數據並畫圖,再透過一些網頁的技巧,也可以做到 User 點圖可以還原成 Block List 表格,因為可以從 X,Y 座
標中反求其時間值及顏色值(rgb).

在 antispam 這個領域,像在台灣,現在用 procmail 巳經不多了,但不論用什麼技術,重要的是能實現自己想要的
功能及掌握度高,才是最重要的.
作者: 大麻    时间: 2004-09-27 09:21
标题: SpamAssassin的中文垃圾邮件过滤规则集
精彩!这是我迄今为止看到 cu mail 区最棒的讨论。一段时间来,我也无暇顾及这里,今天看到这样的帖子,感到非常的欣慰!

abel 和 hzqbbc 在技术方面的深厚功底、求学态度,以及诲人不倦的奉献精神,值得大家学习和敬佩。
作者: zhangweibo    时间: 2004-09-27 13:19
标题: SpamAssassin的中文垃圾邮件过滤规则集
abel兄:

能把你的对procmail的研究写个文档吗?感觉现在网上的例子都非常简单,不能深刻体会他的精髓。

期待哦
作者: abel    时间: 2004-09-27 15:29
标题: SpamAssassin的中文垃圾邮件过滤规则集
原帖由 "zhangweibo" 发表:
abel兄:

能把你的对procmail的研究写个文档吗?感觉现在网上的例子都非常简单,不能深刻体会他的精髓。

期待哦

你可以做過功課後不懂而問,但我不會主動寫文檔,這種東西會寫不完,

如果你做了
man procmail/procmailrc/procmailex/formail , 大概就可以了解我上
面寫的東西涵意, 你若看了,有什麼不懂處,或可我還可以幫忙...

且我個人也不喜那種什麼都不做就來問的人
作者: hzqbbc    时间: 2004-09-28 11:57
标题: SpamAssassin的中文垃圾邮件过滤规则集
原帖由 "zhangweibo" 发表:
abel兄:

能把你的对procmail的研究写个文档吗?感觉现在网上的例子都非常简单,不能深刻体会他的精髓。

期待哦


其实还是不要指望等待其他人将困难摆平,自己动手,丰衣足食。

想起之前我在玩ecartis(一个list软件,前身listar)想要支持虚拟主机时遇到困难,而官方的文档都非常稀缺,本来想看看国内有没有人搞,搜索了一下觉得自己搞错了,官方的都没有完整的,国内基本上就。。。

最后还是自己动手,看ecartis自带的docs及listar的一些老文章,还有手册/manual及参数表和web管理端的模板里的解释,还有邮件列表,最后才叫比较明白的解决了虚拟主机的问题。并接连解决了归档,web形式的归档显示,管理等一堆东西。。

文档也就可以写出来了。see http://postfix.org.cn/howto-ecartis.html

主要是担心不写文档,会给人问死掉的。。还是建议大家多自己动脑筋,多动手,没有东西搞不定。。尤其是安装/配置,开发写程序有时搞不出可能就真的是搞不出的了。。
作者: hzqbbc    时间: 2004-09-28 12:03
标题: SpamAssassin的中文垃圾邮件过滤规则集
原帖由 "大麻" 发表:
精彩!这是我迄今为止看到 cu mail 区最棒的讨论。一段时间来,我也无暇顾及这里,今天看到这样的帖子,感到非常的欣慰!

abel 和 hzqbbc 在技术方面的深厚功底、求学态度,以及诲人不倦的奉献精神,值得大家学习..........


麻哥太抬举了,其实偶等雕虫小技不足挂齿, 压根算不上什么东西,我感觉我们国内的大环境还是很糟糕,不少方面都比不上tw,更别提jp和老外了。

我认为不管是bbs还是lists,都应该营造务实,尊重知识产权/劳动的氛围,而不应是现在的气氛。。动不动就“衣来伸手,饭来张口”。

不是打击,其实我们这样下去,不是进步,而是迅速远去世界之领先科技。现在我感觉中国的年轻一代(我们自己)已不如上一辈人那么肯干,苦干和踏实了。。想想以前,条件艰苦100倍,也能搞出很多高科技,现在¥¥多了环境好了反而没成绩了。说来说去就是不如前辈努力和自立更生,团结拉!

ps:中秋来临,祝大家中秋happy。。。。。   
作者: abel    时间: 2004-09-29 03:04
标题: SpamAssassin的中文垃圾邮件过滤规则集
我想 hzqbbc 兄也是那種走過深刻自我學習的過程,這過程雖然辛苦費時,但卻讓能力更紮實

至於 zhangweibo 兄的要求,或可有時間我可做,但不能保證,重要的是您自己要去看,去研究,
就像解 email 中文的編碼問題一般, 對於 8bits/QP/Base64 的方法論, Language Tag, Charset,
Transfer-Encoding ...等在研究 procmail 時就投入時間在研究, procmail 要用的好不只
對語法要熟而以,對 Email Header/Encoding/... 也都要熟呀,這個領域對於多數人來說,沒有
什麼特別需要研究之處,但對於像我這種土法練鋼的人來說,我都得弄清楚,我就可以知道,這封信
Bcc 給誰,或 To/Cc 的每個人,EMAIL To Pager/SMS (Call CGI)...
procmailrc 的使用沒有 SA 或現在其他 anti-spam 軟體好使,也是它在 antispam 這個領域日漸
漠落的地方,若現在才要學或碰的人,其實多沒有什麼必要.累死自己


我认为不管是bbs还是lists,都应该营造务实,尊重知识产权/劳动的氛围,而不应是现在的气氛。。动不动
就“衣来伸手,饭来张口”。

這句話真是說到我心坎裏了,這也是目前個人在 CU 看到的一個最不滿意的現象呀,

http://bbs.chinaunix.net/forum/14/20040918/409855.html
這篇的樓主是雖初學,我在第一篇只提示要注意處,他自己就做出來了,這樣的結果對
提問人及回答的人都是一個最好的 feeling! 即使再差,我相信每個人都願意幫他

http://bbs.chinaunix.net/forum/14/20040927/415186.html
這一篇給人的感覺就是如 hzqbbc 兄說的,只要一個伸手的答案(我的感覺而以,若得罪請見諒),但還是只
給一個提示,接下來就可知道樓主是否是肯做功課的人了(我有種感覺這一樓的不會去做功課)

這兩樓的人的問題幾乎都是沒有中文資料的,純看樓主是否花心思去研究了
側面了解,我知道 "大尾巴羊" 兄學 sendmail 也沒多久,我相信,假以時日,此二人在這個領域程度就會拉開
作者: xiaohua    时间: 2004-09-29 14:06
标题: SpamAssassin的中文垃圾邮件过滤规则集
那站点,关闭了?
作者: abel    时间: 2004-09-29 14:09
标题: SpamAssassin的中文垃圾邮件过滤规则集
不知您指的是那站點 !?
作者: 我菜我怕谁    时间: 2004-09-29 20:15
标题: SpamAssassin的中文垃圾邮件过滤规则集
很长见识,路漫漫其休远兮!!努力!!
作者: laozei    时间: 2004-09-30 09:07
标题: SpamAssassin的中文垃圾邮件过滤规则集
完全不懂各位在谈什么

看戏中...
作者: raullpq    时间: 2004-10-08 13:26
标题: SpamAssassin的中文垃圾邮件过滤规则集
原帖由 "hzqbbc" 发表:


麻哥太抬举了,其实偶等雕虫小技不足挂齿, 压根算不上什么东西,我感觉我们国内的大环境还是很糟糕,不少方面都比不上tw,更别提jp和老外了。

我认为不管是bbs还是lists,都应该营造务实,尊重知识产权..........


赞~强烈同意 !!!
作者: zenisys    时间: 2004-10-09 13:38
标题: SpamAssassin的中文垃圾邮件过滤规则集
我也是用sendmail+procmail

前几个月遇到中文解码的问题
这回终于有明白人了
各位老大,谢谢
作者: abel    时间: 2004-10-09 18:33
标题: SpamAssassin的中文垃圾邮件过滤规则集
這一段較少人研究,我給您解釋一下好了:
Mail 的 Subject 或 Body 編碼有三種,
第一種就是原型,什麼都不編碼 "酷!學園"
第二種是 Mime 以 base64 以 6 bit 來編碼,base32 以 5 個 bit ,但Mail 都是用 base64
如: =?big5?B?jjfkdoooo=?= (這一段mime 我是隨意打的)
Ex:

  1. BIG5 code  = Mime Base64
  2. 104速配快遞 =?big5?B?MTA0s3SwdKfWu7w=?=
  3. Re:104速配快遞 =?big5?B?UmU6IDEwNLN0sHSn1ru8?=
  4. 我溜104速配快遞 =?big5?B?p9q3yDEwNLN0sHSn1ru8?=
  5. Re:我溜104速配快遞 =?big5?B?UmU6IKfat8gxMDSzdLB0p9a7vA==?=
  6. Fw:我溜104速配快遞 =?big5?B?Rnc6IKfat8gxMDSzdLB0p9a7vA==?=
复制代码

你會發現這幾個的 mime patten 天差地遠...所以 procmailrc 中的 patten 就不是
* ^Subject: 酷!學園 ---->;有90%以上的機會會錯掉
* ^Subject: =?big5?B?jjfkdoooo=?= --->;有75%的機會會錯掉,不過可以取巧,將四種可能都設上
Mime 的編碼在 8bit email subjext 裏面我覺得大概佔到近八成左右,所以要多再注意
第三種稱為 QP (quote-print) , 直接還原 binary code 你有時會看到 =A3=BB...就是了

# 這是還原 encoding 的一段 perl 程式:

  1. #!/usr/bin/perl
  2.     $sub=$ARGV[0];
  3.     if ($sub=~ /=\?\S+\?\l(\S)\?/) {
  4.       if ($1 =~ /[Qq]/) {
  5.         $sub=decode_qp($sub);
  6.       }
  7.       elsif ($1 =~ /[Bb]/) {
  8.         $sub=decode_base64($sub);
  9.       }
  10.     }
  11.     elsif ($sub=~ /=[a-fA-F0-9][a-fA-F0-9]/) {
  12.       $sub=decode_qp($sub);
  13.     }
  14.     $subject.=$sub;
  15. print $subject;   
  16. sub decode_qp {
  17.         my($string) = @_;
  18.         @buffer=split(/\?/,$string);
  19.         $string = $buffer[3] if ($buffer[3] ne "");
  20.         $string =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
  21.         $string =~ /\?=(.*)/;
  22.         $string =~ tr/_/ /;
  23.         $buffer[4]=~s/^=//;
  24.         $buffer[0]=~s/=$//;
  25.         $string="$buffer[0]$string$buffer[4]";
  26.         return($string);
  27. }

  28. sub decode_base64 {
  29.         my($string) = @_;
  30.         my($string2);
  31.         @buffer=split(/\?/,$string);
  32.         $string = $buffer[3] if ($buffer[3] ne "");
  33.         $string =~ s/=+$//;
  34.         $string =~ tr|A-Za-z0-9+/| -_|;
  35.         while($string =~ /(.{1,60})/gs) {
  36.                 my($string3) = chr(32+length($1)*3/4);
  37.                 $string2 .= unpack("u",$string3 . $1 );
  38.         }
  39.         $buffer[4]=~s/^=//;
  40.         $buffer[0]=~s/=$//;
  41.         $string2="$buffer[0]$string2$buffer[4]";
  42.         return($string2);
  43. }
复制代码

假設就叫 /etc/parser_subj , 並 chmod 755

/etc/parser_subj $SUBJ 就可以取出原來的中文字了
(巳考慮 8bit/Mime/QP 問題,直接用就可以,但這只 for BIG5, GK2323 上面程式自己改就可以了)
存放 SPAM_PATTEN 的 mysql desc:

  1. +----------+--------------+------+-----+---------+----------------+
  2. | Field    | Type         | Null | Key | Default | Extra          |
  3. +----------+--------------+------+-----+---------+----------------+
  4. | SN       | int(20)      |      | PRI | NULL    | auto_increment |
  5. | USERNAME | varchar(16)  |      | MUL |         |                |
  6. | PATTEN   | varchar(128) |      | MUL |         |                |
  7. | CNT      | int(20)      |      |     | 0       |                |
  8. +----------+--------------+------+-----+---------+----------------+
复制代码



所以,針對中文主旨問題,整個 procmail 方案為:

  1. VERBOSE=on
  2. LOGFILE=$HOME/procmail/procmail.log
  3. PATH=/bin:/usr/bin:/usr/local/bin
  4. LANG=zh_TW.Big5
  5. LC_ALL=zh_TW.Big5
  6. SUBJ=`formail -zxSubject: `
  7. SUBJ=`/etc/parser_subj "${SUBJ}"`

  8. :0 hD
  9. * ! ^From: .*mydomain.net.*
  10. * ! ^Received: .*192\.168\..*
  11. {
  12.         :0 fh
  13.         | ( patten=`echo "select concat(PATTEN,\" \") from SPAM_PATTEN where USERNAME='$LOGNAME' and instr('$SUBJ',PATTEN)"|$MYSQL      | grep -v 'PATTEN'`; \
  14.         if [ ${#patten} -ne 0 ] ; \
  15.                 then    formail -A "Spam: $patten";     \
  16.                 echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM','$TO','$SUBJ','$FILE',1,'$LOGNAME','符合特定字串','$patten')" | $MYSQL;       \
  17.         fi;     \
  18.         for p in $patten;do     \
  19.                 echo "update SPAM_PATTEN set CNT=CNT+1 where USERNAME='$LOGNAME' and PATTEN='$p'"|$MYSQL;       \
  20.         done);

  21.         :0
  22.         * ^Spam: .*
  23.         /dev/null
  24. }
复制代码

PS1: 以上皆是 for BIG5 環境來說明


因為我要計數,要存記錄,所以程式為稍長,若只要判斷到就直接導到檔案或 null, 就只要兩行就好了


  1. :0 hD
  2. * ! ^From: .*mydomain.net.*
  3. * ! ^Received: .*192\.168\..*
  4. * $(echo "select concat(PATTEN,\" \") from SPAM_PATTEN where USE
  5. RNAME='$LOGNAME' and instr('$SUBJ',PATTEN)"|$MYSQL      | grep -v 'PATTEN')
  6. /var/spool/mail/spam_patten
复制代码


了解原理(Mail Encoding/Format), 及 procmailrc 功能,要做什麼都很簡單,個人覺得
procmail 妙用很多,可以發揮許多 email to program 的功能
作者: zhdotchen    时间: 2004-10-13 16:35
标题: SpamAssassin的中文垃圾邮件过滤规则集
abel,

你做过rrdtool的中文化?我现在急需在rrdtool产生的图形上显示中文,能否指教一下?
谢谢!
作者: abel    时间: 2004-10-13 17:35
标题: SpamAssassin的中文垃圾邮件过滤规则集
http://phorum.study-area.org/viewtopic.php?t=23822&highlight=
自己去看看囉~
你若懂程式是最好不過,用在那個版本都知道怎麼改
這個 download 版是 1.0.42 的,你可以拿 1.0.42 來 diff
一下,可以直接套用在 1.0.45+ 以上的版本,都是 work 的,
並注意 Makefile 也要跟著改,我不是做慈善事業的,所以沒有
把它寫的盡善盡美 ...

不過話說回來,看來多數人只會予取予求呀~您巳是第N位和我要的人了
作者: bluelotus    时间: 2004-10-13 23:15
标题: SpamAssassin的中文垃圾邮件过滤规则集
本来是谈论spamassassin(简称SA)的贴子,现在全部在讲procmail,我最近刚装了spamassassin的中文规则集,忍不住谈谈自己的感受。spamassassin据我看,很多人仍然没有意识到这是个什么东西,它并不是一个过滤垃圾邮件的软件,准确地说,应该是一个对输入文本根据规则进行分析的软件。形象地说,就好象一个体操比赛,SA就是裁判,给每一个出场的队员根据规则打分,然后将分数转交给组委会。SA根据规则,对输入的文本打出一个分数,至于是不是垃圾邮件,你可以自己指定一个分数线,超过分数的SA给它打上一个标记。SA并不负责前期的邮件解码等工作,也不负责后期对垃圾邮件的处理工作,所以SA的应用范围就不局限于垃圾邮件过滤,还可应用于其它需要文本分析的场合。SA对文本的分析识别有很强的自学能力,也就是能够从分析过的文本当中自动提取新的规则,从而使其分析的准确性越来越高,也许这就是SA为什么会日渐流行的一个原因。
关于SA的自学能力,我只是看来的,还没有切身的体会。我认为SA的前途将会很好,是因为这是一个适合于懒人用的工具。我以前一直想做垃圾邮件的过滤,但一直惧怕自己编写庞大的规则集,可能一次、两次还不怎样,但要自己长时间地不断修正规则集,自问很难做到。让每个用户编写自己的过滤规则,我觉得即使你的邮件系统提供这个功能,也基本上形同虚设。至少在我身边,我还没有见到有人这样做,就说我自己,且不要说procmail的复杂性,就是用outlook设置几个简单的规则来过滤垃圾邮件,也只试了一次就放弃了,还是每天花10分钟时间看一下上百封的垃圾邮件,根据标题判定一下,然后将垃圾邮件删除。
我相信普通用户不应该花时间来设定垃圾邮件的判定规则,即使系统管理员,如果不是专做邮件系统的,也没有必要花很多时间来研究垃圾邮件,自己写规则。我就是这样一个比较懒的系统管理员,幸好有了SA,有了ccert的中文规则集。
现在我用了将近一个星期,每天的垃圾邮件一百封左右,用SA的中文规则集识别后,垃圾邮件能过滤掉80多封,对垃圾邮件的识别率在75%-95%之间,平均85%,我没有设任何自己的规则,只用了ccert的中文规则集。
系统资源的占用情况,也不是很恐怖。举一例,我的服务器是单CPU,普通奔4 2.4G,识别一个18928字节的邮件,用时5.735775秒。SA占用资源的情况,和规则集也有很大关系。以前没有中文规则集,我按英文过滤的方式装了razor和dcc,结果一个邮件半天没反应,分析一个邮件就花了几分钟。
总之,我对SA相当看好,如果有现成的规则集,对付垃圾邮件,你几乎不需要操什么心,现在我的邮件系统,用户只需要设置一下处理垃圾邮件的方式:直接删除,送到垃圾箱,还是不做处理。我觉得这就是用户最想要的,不动脑子,不费劲,就可以基本摆脱垃圾邮件的困扰,而作为管理员,我不必每天去为用户的垃圾邮件浪费我的精力和时间。即使设置自己的规则集,编写起来我觉得比楼上各位说的用procmail容易多多了。
为了证明以上我所说的,大家可以到我的一个邮件服务器上试一下。
服务器地址:mail.0874.cn
用户名:123
密码:123123
最后,衷心感谢SA,感谢ccert,感谢陈光英博士,为我们提供了这么好的东西。
作者: carelezz    时间: 2004-10-14 09:45
标题: SpamAssassin的中文垃圾邮件过滤规则集
procmail和sa只是解决问题的两种途径
没必要厚此薄彼
看习惯了

--
作者: svm    时间: 2004-10-20 13:39
标题: SpamAssassin的中文垃圾邮件过滤规则集
To Bluelotus:

下面是来自 http://www.ccert.edu.cn/spam/sa/Chinese_rules.htm 的测试数据,测试过程中除了中文规则以外不使用其它任何规则。我觉得你在设置阈值的时候可以参考。

阈值   垃圾邮件查全率(共2330    正常邮件误判率(共96553)
0.5     85.1%                               15.1%
1        76.9%                               6.4%
1.5     71.4%                               4.4%
2        65.1%                               2.4%
2.5     61.7%                               1.7%
3        57.5%                               1.2%
3.5     52.8%                               1%
4        48.4%                               0.8%
4.5     45%                                  0.6%
作者: svm    时间: 2004-10-20 20:00
标题: SpamAssassin的中文垃圾邮件过滤规则集
下面是我用perl语言对邮件解码的代码供大家参考:

use MIME::Base64;
use MIME:uotedPrint;

$msg =~ s/=\?GB2312\?B\?(.*)\?=/decode_base64 ($1)/ieg;
$msg =~ s/=\?GB2312\?Q\?(.*)\?=/decode_qp ($1)/ieg;
作者: jianxia    时间: 2006-10-23 11:26
我试用了这个规则,结果被商务部骂死。“贵公司”竟然占了2分多!商务部的好多邮件被当作了垃圾邮件了!
作者: cnzg_y    时间: 2008-07-14 23:19
非常感谢 abel兄 和 hzqbbc 兄 ,将认真研究两位的大作,我是从今年开始才实质性的研究、实验 E-mail 系统。再次感谢两位!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2