Chinaunix

标题: 分享:小弟maildrop过滤心得,另有问题请教各位大大! [打印本页]

作者: leo4364088    时间: 2007-05-31 16:18
标题: 分享:小弟maildrop过滤心得,另有问题请教各位大大!
该贴内容已被楼主更改,详情请见楼下!

[ 本帖最后由 leo4364088 于 2007-6-5 10:49 编辑 ]
作者: leo4364088    时间: 2007-05-31 16:23
该贴内容已被楼主更改,详情请见楼下!

[ 本帖最后由 leo4364088 于 2007-6-5 10:44 编辑 ]
作者: leo4364088    时间: 2007-05-31 17:34
该贴内容已被楼主更改,详情请见楼下!

[ 本帖最后由 leo4364088 于 2007-6-5 10:45 编辑 ]
作者: vyouzhi    时间: 2007-06-01 10:45
白名单中的
Maildir
都要加VHOME
作者: leo4364088    时间: 2007-06-04 09:36
谢谢vyouzhi,我后来仔细想了想,也觉得是这样的。现在正在实验中,希望能顺利通过测试。
作者: miwucc    时间: 2007-06-04 11:31
楼主能不能分享一下你具体的过滤方法啊?我正在做一个qmail上过滤垃圾邮件的设计~但是试了好多都出不来~能不能给我说说你的具体方法~谢谢了~!
作者: leo4364088    时间: 2007-06-05 10:30
那小弟就来献丑一下了,由于技术水平有限,若有错误的地方,敬请指出,谢谢!

首先,我是用SA对邮件进行打分,超过一定分数就做好SPAM标示。SA过滤规则可参考http://www.thismail.org/bbs/forumdisplay.php?fid=10

然后,交给maildrop处理。下面以liutao@goldtelecom.cn为例:

# touch /home/vpopmail/domains/goldtelecom.cn/.qmail-default
# chown vpopmail:vchkpw /home/vpopmail/domains/goldtelecom.cn/.qmail-default
# chmod 600 /home/vpopmail/domains/goldtelecom.cn/.qmail-default
# vi /home/vpopmail/domains/goldtelecom.cn/.qmail-default
| preline /usr/local/bin/maildrop .mailfilter

# touch /home/vpopmail/domains/goldtelecom.cn/.mailfilter
# chown vpopmail:vchkpw /home/vpopmail/domains/goldtelecom.cn/.mailfilter
# chmod 600 /home/vpopmail/domains/goldtelecom.cn/.mailfilter
# vi /home/vpopmail/domains/goldtelecom.cn/.mailfilter

HOME=`/home/vpopmail/bin/vuserinfo -d $EXT@$HOST`
VSPAM=`/home/vpopmail/bin/vuserinfo -d spam@$HOST`

`test -d $VHOME/Maildir/`
if( $RETURNCODE != 0 )
{
to /dev/null #无主邮件直接删除
}
else
{
exception {
include $VHOME/.mailfilter #引用个人用户过滤规则
}
}
if ( $SIZE < 262144 ) #如果邮件小于256KB,执行如下操作
{
exception {
xfilter "/usr/bin/spamc -f -u $EXT@$HOST"
}
}
if (/^X-Spam-Flag: YES/)
{
cc "$VSPAM/Maildir/." #如果标示为垃圾邮件,抄送一份给spam@goldtelecom.cn
to "$VHOME/Maildir/.Trash/." #如果标示为垃圾邮件,投递到用户垃圾箱
EXITCODE=0
}
else
{
to "$VHOME/Maildir/." #其余邮件直接投递到收件箱
}

# touch /home/vpopmail/domains/goldtelecom.cn/liutao/.mailfilter
# chown vpopmail:vchkpw /home/vpopmail/domains/goldtelecom.cn/liutao/.mailfilter
# chmod 600 /home/vpopmail/domains/goldtelecom.cn/liutao/.mailfilter
# vi /home/vpopmail/domains/goldtelecom.cn/liutao/.mailfilter

#黑名单部分,发信人来信直接删除
if(/^From:.*bad@abc.net/)
{
to "/dev/null"
}
if(/^From:.*bad@test.com/)
{
to "/dev/null"
}
#白名单部分,发信人来信转移到收件箱
if(/^From:.*good@abc.net/)
{
to "$VHOME/Maildir/."
}
if(/^From:.*good@test.com/)
{
to "$VHOME/Maildir/."
}
##自定义部分,如果主题含有应聘字眼,转移到收件箱(由于自定义规则比较麻烦,请参考楼下:)
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB=~/.*应聘*/ )
{
to "/home/vpopmail/domains/goldtelecom.cn/liutao/Maildir/."
}
作者: leo4364088    时间: 2007-06-05 10:30
一、邮件来源

如果邮件来源包括test.com:
if(/^From:.*test.com*/ || /^From:.*test.com*/ || /^From:.*TEST.COM*/)

如果邮件来源不包括test.com:
if(/^From:!.*test.com*/ || /^From:!.*test.com*/ || /^From:!.*TEST.COM*/)

如果邮件来源是user@test.com:
if(/^From:.*user@test.com>/ || /^From:.*user@test.com>/ || /^From:.*USER@TEST.COM>/)

如果邮件来源不是user@test.com:
if(/^From:!.*user@test.com>/ || /^From:!.*user@test.com>/ || /^From:!.*USER@TEST.COM>/)

如果邮件来源以user开始:
if(/^From:*user*.>/ || /^From:*user*.>/ || /^From:*USER*.>/)

如果邮件来源以test.com结束:
if(/^From:.*test.com>/ || /^From:.*test.com>/ || /^From:.*TEST.COM>/)

如果邮件来源包括test.com(区分大小写):
if(/^From:.*test.com*/)

如果邮件来源不包括test.com(区分大小写):
if(/^From:!.*test.com*/)

如果邮件来源是user@test.com(区分大小写):
if(/^From:.*user@test.com>/)

如果邮件来源不是user@test.com(区分大小写):
if(/^From:!.*user@test.com>/)

如果邮件来源以user开始(区分大小写):
if(/^From:*user*.>/)

如果邮件来源以test.com结束(区分大小写):
if(/^From:.*test.com>/)

二、邮件接收者

如果邮件接收者包括:
if(/^To:.*test.com*/ || /^To:.*test.com*/ || /^To:.*TEST.COM*/)

如果邮件接收者不包括test.com:
if(/^To:!.*test.com*/ || /^To:!.*test.com*/ || /^To:!.*TEST.COM*/)

如果邮件接收者是user@test.com:
if(/^To:.*user@test.com>/ || /^To:.*user@test.com>/ || /^To:.*USER@TEST.COM>/)

如果邮件接收者不是user@test.com:
if(/^To:!.*user@test.com>/ || /^To:!.*user@test.com>/ || /^To:!.*USER@TEST.COM>/)

如果邮件接收者以user开始:
if(/^To:*user*.>/ || /^To:*user*.>/ || /^To:*USER*.>/)

如果邮件接收者以test.com结束:
if(/^To:.*test.com>/ || /^To:.*test.com>/ || /^To:.*TEST.COM>/)

如果邮件接收者包括test.com(区分大小写):
if(/^To:.*test.com*/)

如果邮件接收者不包括test.com(区分大小写):
if(/^To:!.*test.com*/)

如果邮件接收者是user@test.com(区分大小写):
if(/^To:.*user@test.com>/)

如果邮件接收者不是user@test.com(区分大小写):
if(/^To:!.*user@test.com>/)

如果邮件接收者以user开始(区分大小写):
if(/^To:*user*.>/)

如果邮件接收者以test.com结束(区分大小写):
if(/^To:.*test.com>/)

三、邮件主题

如果邮件主题包括:发票
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB=~/.*发票*/)

如果邮件主题不包括:发票
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB=~/!.*发票*/)

如果邮件主题是:发票
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB==/发票/)

如果邮件主题不是:发票
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB!=/发票/)

如果邮件主题以“发票”开始:
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB=~/^发票*/)

如果邮件主题以“发票”结束:
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB=~/.*发票/)

四、邮件长度

如果邮件长度 >= 1024KB
if($SIZE >= 1024)

如果邮件长度 < 1024KB
if($SIZE < 1024)

五、事后操作

拒收
to "/dev/null"

移动到收件箱
to "$VHOME/Maildir/."

移动到垃圾箱
to "$VHOME/Maildir/.Trash"
作者: leo4364088    时间: 2007-06-05 10:34
现在有个问题,就是执行/home/vpopmail/domains/goldtelecom.cn/.mailfilter脚本的时候,只能执行到 include $VHOME/.mailfilter , 也就是说 , 并没有执行 if ( $SIZE < 262144 ) 后的操作。
我想可能是脚本有问题,望各位老大悉心指点。
作者: abel    时间: 2007-06-05 10:55
如果邮件来源包括test.com:
if(/^From:.*test.com*/ || /^From:.*test.com*/ || /^From:.*TEST.COM*/)

==> 這個也只能從 Mail Header 中來看,不代表就一定是 Envelope Sender
==> 要我來用這個 test.com 一定寫成一個變數且忽略大小寫, Ex:
WHITE_LIST=`cat list_file1|tr '\n' '|'`
BLACK_LIST=`cat list_file2|tr '\n' '|'`

if (/^From:.*($WHILE_LIST).*/    <== 這裏是 : D , 連在一起,因為轉成表情符號, 意指忽略大小寫

這邊通常我都是用 mysql 而不是由 file 而來,如此 user 做 White/Black List 的 增/刪/修 都會容易處理許多
其他就同理了,不管是 To, Subject 等等的,用這類的東西最好先把 變數的使用方法及語法的定義等都看清楚,可以
節省自己許多事的

Ex: 我的 mysql + procmail 例子:

  1. MYSQL="mysql -h $host -u abel -pXXXXX $DB"

  2. WHITE_LIST=`echo "SELECT WHITE_NAME FROM WHITE_LIST WHERE USERNAME='$LOGNAME' AND instr(lower('$FROM'),lower(WHITE_NAME)) or instr(lower(WHITE_NAME),lower('$SUBJ') )"| $MYSQL |  tr '\n' '|' ; echo "jklrjkljrkl295jljkfa"`
  3. :0 H
  4. * $($WHITE_LIST)
  5. $ORGMAIL

复制代码

只要郵件表頭 (header) 中 From/Subject 含了 mysql 取出來的字,那就算是白名單
夠簡單吧,不過這可是要經過無數的焠練才能理解

[ 本帖最后由 abel 于 2007-6-5 11:02 编辑 ]
作者: abel    时间: 2007-06-05 11:01
原帖由 leo4364088 于 2007-6-5 10:34 发表
现在有个问题,就是执行/home/vpopmail/domains/goldtelecom.cn/.mailfilter脚本的时候,只能执行到 include $VHOME/.mailfilter , 也就是说 , 并没有执行 if ( $SIZE < 262144 ) 后的操作。
我想可能是脚本 ...

照一般語言的邏輯,那一定是 include 的 file 有問題, 把它單獨拉出來跑看看
作者: leo4364088    时间: 2007-06-05 11:10
“變數”???不好意思,小弟没能理解,能否讲解一二,万分感谢!

[ 本帖最后由 leo4364088 于 2007-6-5 11:17 编辑 ]
作者: abel    时间: 2007-06-05 11:23
原帖由 leo4364088 于 2007-6-5 11:10 发表
“變數”???不好意思,小弟没能理解,能否讲解一二,万分感谢!

首先,您必需了解,我個人並不懂 maildrop, 我只懂 procmail
變數(大陸好像都講變量吧)就像您前面提到的:
NSUB=`/usr/sbin/maildecode $SUBJECT`

如果您用這個東西來還原 base64 encoding , 那同理,白名單,黑名單都可以從 ` ` 而來
再把這個變量帶進去 if 中, 並適當的使用 : D  (大小寫視為相同)
ex:
if (/^From: ($WHITE_LIST)/: Dh)   (: 後是連在一起的, h 表示只看 header)
如此您只要維誰 $WHITE_LIST 的來源,這個來源就看您用什麼方式產生
我是用 mysql , 簡單一點可以用 file , 但您的例子是寫死在程式中

我只大概看了 maildrop manpage , 但過去我曾花一週的時間專研 procmail
看起來道理都是相同的,只是語法上的差異而以
作者: leo4364088    时间: 2007-06-05 11:29
明白了,谢谢abel老大,小弟受益非浅!
作者: leo4364088    时间: 2007-06-05 15:37
试了一下,确实是被 include 的 file 有问题,如下。

# more /home/vpopmail/domains/goldtelecom.cn/liutao/.mailfilter

#黑名单部分,发信人来信直接删除
if(/^From:.*bad@abc.net/)
{
to "/dev/null"
}
if(/^From:.*bad@test.com/)
{
to "/dev/null"
}
#白名单部分,发信人来信转移到收件箱
if(/^From:.*good@abc.net/)
{
to "$VHOME/Maildir/."
}
if(/^From:.*good@test.com/)
{
to "$VHOME/Maildir/."
}
##自定义部分,如果主题含有应聘字眼,转移到收件箱
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB=~/.*应聘*/ )
{
to "$VHOME/Maildir/."
}

问题应该出在“自定义部分”,我若将该部分内容完全删除,则一切正常。

[ 本帖最后由 leo4364088 于 2007-6-7 09:31 编辑 ]
作者: abel    时间: 2007-06-05 16:24
這問題有賴您自己去找原因了
我個人並不曉得為什麼,因為我對 maildrop 並無任何研究
或許變量的 Scope 是個問題也不一定
作者: leo4364088    时间: 2007-06-05 16:55
好的,谢谢abel老大!小弟我正在努力,一定要把问题解决!
再次表示感谢!
作者: vyouzhi    时间: 2007-06-06 12:03
白名单或黑名单用

  1.         if ( /^From:\s*(.*)/ && lookup( $MATCH, "./.whitefile" ))
  2.         {
  3.          }
复制代码

为最好
关键字用SA来做检查
作者: 枫影谁用了    时间: 2007-06-06 21:04
请教一下这个情况:

如果邮件来源包括test.com:
if(/^From:.*test.com*/ || /^From:.*test.com*/ || /^From:.*TEST.COM*/)

这个是说包含域名,因为域名是有假冒的,我再加一个IP
即域来自test.com,同时IP也来自128.3.0.0/16,两个条件同时符合时就直接送到收件箱.

这个IP的条件试过好多个都没有试出来.还有同时成立,如果是在local.cf里倒是好写!!

[ 本帖最后由 枫影谁用了 于 2007-6-6 22:39 编辑 ]
作者: leo4364088    时间: 2007-06-07 09:30
判断IP和域名相符,偶只知道在local.cf中能实现,至于在mailfilter中偶还不知怎样实现

[ 本帖最后由 leo4364088 于 2007-6-7 09:32 编辑 ]
作者: 枫影谁用了    时间: 2007-06-07 10:23
原帖由 leo4364088 于 2007-6-7 09:30 发表
判断IP和域名相符,偶只知道在local.cf中能实现,至于在mailfilter中偶还不知怎样实现


我在找资料,不过应该可以。

在maildrop还是可以加条件的,因为我不需要maildrop去判断IP源,只需要符合两个条件就行。

就是多写一条,如果ip来自128.3.0.0/16的话就直接送到收件箱
作者: phoebewang    时间: 2007-07-04 14:45
标题: 有个问题
如果邮件主题包括:发票
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB=~/.*发票*/)

我的就是这么写的,不过只能过滤主题以"发票"开头的,如果"发票"出现在主题中间,无法过滤,想不明白...
作者: leo4364088    时间: 2007-07-05 09:09
if(/^Subject:.*/)
{
SUBJECT=$MATCH
}
if($SUBJECT ne "")
{
NSUB=`/usr/sbin/maildecode $SUBJECT`
}
if($NSUB=~/.*发票*/)

这样写,能够过滤主题包含“发票”的,不管它在头、尾、还是中间。
我做过实验,已经通过了的。
作者: phoebewang    时间: 2007-07-05 15:17
标题: 我错啦
不好意思,是我表达错误,我碰到问题的是英文,以为中文也一样.我用if($NSUB=~/.*test*/),不能过滤包含空格的主题,如"xiao test one",不过中文就不会出现这个问题.不知道是不是maildecode解码的问题,现在我的正则要变成if ((\$NSUB=~/.*test*/) || (/^Subject:.*test*/)),才能正常过滤中英文或空格




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