免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5356 | 回复: 13
打印 上一主题 下一主题

[Mail] 利用Procmail如何过滤中文的附件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-18 13:55 |只看该作者 |倒序浏览
我所用RH9+Sendmail+IMAP,想利用Procmail来过滤邮件的附档,可是不知为何就是无法过滤中文名的附件,对英文名即可生效。。。。
/etc/procmailrc的正文如下:
:0 B
* ^Content-Type:.*
* ^.*name=.*\.(ppt|exe|com)
/dev/null

请各位高手帮帮忙!

论坛徽章:
0
2 [报告]
发表于 2004-12-21 08:13 |只看该作者

利用Procmail如何过滤中文的附件

等了几天尽没有人理我,只好自已先顶一下啦。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-12-21 12:13 |只看该作者

利用Procmail如何过滤中文的附件

還是老話一句,你自己做了什麼功課....還是做等答案.

email MIME/QP decode
取名為 /etc/parser_subj   (mode 755)

  1. #!/usr/bin/perl
  2.     $sub=join(" ",@ARGV);
  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.     $subject=~s/\'/\\\'/g;
  16.     $subject=~s/\"/\\\"/g;
  17. print $subject;
  18. sub decode_qp {
  19.         my($string) = @_;
  20.         @buffer=split(/\?/,$string);
  21.         $string = $buffer[3] if ($buffer[3] ne "");
  22.         $string =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
  23.         $string =~ /\?=(.*)/;
  24.         $string =~ tr/_/ /;
  25.         $buffer[4]=~s/^=//;
  26.         $buffer[0]=~s/=$//;
  27.         $string="$buffer[0]$string$buffer[4]";
  28.         return($string);
  29. }

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

复制代码


在 procmail 中加入:

  1. LOGABSTRACT=all
  2. LOGFILE=/tmp/procmail.log
  3. tmp=`formail -I "" | sed -e '/Content-Type/,/^$/!d' | grep "filename=" | sed -e 's/.*filename\=\(.*\)\?.*/\1/g'`
  4. ATTACH=`/etc/parser_subj $tmp`

  5. :0
  6. ....這裏你自己去試吧...自己做點功課就會了
复制代码


去看 /tmp/procmail.log 中的東西,就知道用意了

论坛徽章:
0
4 [报告]
发表于 2004-12-22 20:00 |只看该作者

利用Procmail如何过滤中文的附件

老大這幾天我為了這個想盡辦法,就是不如人願,本想利用把其轉碼後進進行過濾,可事後此法行不通,搞到最後造成很多用戶的郵件丟失,明天我再看看你給的代碼。。。不管怎麼樣,我還是得謝謝你的幫助。很多時侯遇到困難,就像迷失了一樣,不知從何下手,所以有你這些指引,我想至少可以少走些彎路,不過我也不會光等著別人,自己的事還得靠自己。。。。。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2004-12-22 20:04 |只看该作者

利用Procmail如何过滤中文的附件

嗯~
這段 code 或你自己加的東西,放在
$HOME/.procmailrc 較好
等你試出來後再移到 /etc/procmailrc

放在 $HOME/.procmailrc 原因只對該 user 有效
放在 /etc 對全 mail server 皆有效.
因為你不能掌握技巧,從自己先實驗起較好

另外,就是你的問題不明確...上面我也只能 .... 帶過
中文檔名, 然後呢 ?

论坛徽章:
0
6 [报告]
发表于 2004-12-23 08:51 |只看该作者

利用Procmail如何过滤中文的附件

今天一大早我就把这段CODE加进去了,可是试了几下不行,也不知哪里出了问题,对了老大你那里有没有关于Procmail方面的资料,虽然在网上找了一点,但看完后没什么价值,还是一头雾水没明白。目前我遇到的问题是无法过滤是中文的附件,对于英文却没有问题。以下是我的MSN也是我的电邮地址,欢迎把我加入:guiweizhao@elegance-group.com

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-12-23 17:58 |只看该作者

利用Procmail如何过滤中文的附件

嗯~這個問題我們版上討論就可以了,
沒必要私下交流,因為您的問題也可能是日後其他朋友的參考
所以,請見諒

最後,會建議您,學好英文,才可能學好 sendmail
因為中文的 sendmail 資料真的很少
好好努力把 sendmail 附的 cf/README 看完
procmail* 相關的東西看完,
這樣才能提昇實力,用問的有時都太片面化了,見樹不見林

论坛徽章:
0
8 [报告]
发表于 2004-12-24 16:57 |只看该作者

利用Procmail如何过滤中文的附件

你说得极对,这不我从上月开始又在啃英文书了,但是在啃之前,能否先帮我把这个问题给解决了,上述的那个编码是否非要手工输入,直接用COPY到一个新文件可否?昨天我就是利用后者COPY进去的,但是还是不行,后来用base64也没有成功。我在/etc/目录下创建了parser_subj,然后把你上述的正文复制进去,接着就是更改procmailrc的文件,把以下这段CODE追加进去。
LOGABSTRACT=all
LOGFILE=/tmp/procmail.log
tmp=`formail -I "" | sed -e '/Content-Type/,/^$/!d' | grep "filename=" | sed -e 's/.*filename\=\(.*\)\?.*/\1/g'`
ATTACH=`/etc/parser_subj $tmp`

:0

重启Sendmail后还是不行!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-12-24 17:48 |只看该作者

利用Procmail如何过滤中文的附件

修改 procmailrc 不用 restart sendmail

:0 然後呢 ?

procmail log 說什麼你有注意看嗎 ?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2004-12-24 18:48 |只看该作者

利用Procmail如何过滤中文的附件

我只看 man page 或官網後學習的結果:


  1. PATH=$PATH
  2. SHELL=/bin/sh
  3. MAILDIR=/var/spool/mail
  4. VERBOSE=yes
  5. LOGABSTRACT=all
  6. SENDMAIL=/usr/sbin/sendmail
  7. LOGFILE=$HOME/procmail/procmail.log
  8. FILE=`echo $HOME`/procmail/mail_folder/mail-`date +%Y%m%d%H%I%S`-`echo $$`.eml
  9. tmp=`formail >; $FILE; chmod 644 $FILE`
  10. tmp=`formail -zxSubject:`
  11. SUBJ=`/etc/parser_subj "$tmp"| sed -e "s/[\$,\(,\),\',\\]//g"`
  12. FROM=`formail -zxFrom:| sed -e 's/.*<\(.*\)>;.*/\1/g'`
  13. SPAMID=`formail -I ""|grep '/sc?id=' | sed -e 's/.*id=\(.*\)/\1/g'`
  14. PTR=`formail -zxReceived:|grep ^from|sed -e 's/.*\[\(.*\)\.\(.*\)\.\(.*\)\.\(.*\)\].*/\4.\3.\2.\1/g'|head -1`
  15. MYSQL="mysql -h procmail.mydomain.net.tw -u abel -pxxxxxxxx procmail"

  16. # 從網頁取回來的信不再過濾
  17. :0 H
  18. * ^X-resend:
  19. /var/spool/mail/$LOGNAME


  20. # 白名單處理
  21. WHITE_LIST=`echo "SELECT WHITE_NAME FROM WHITE_LIST WHERE USERNAME='$LOGNAME' AND instr('$FROM', WHITE_NAME ) or instr('$SUBJ', WHITE_NAME )"| $MYSQL |  tr '\n' '|' ; echo "aaaaaaaazzzzzzzzzggggggggg"`
  22. :0 H
  23. * $($WHITE_LIST)
  24. $ORGMAIL

  25. # 標?#125;中巳帶有 SPAM
  26. :0 HD
  27. * ^Subject: SPAM.*
  28. {
  29.         :0 fw
  30.         | ( echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','SPAM','標?#125; SPAM')"    | $MYSQL)

  31.         :0
  32.         /dev/null
  33. }

  34. # 發信不為自己單位但  Message-ID 帶自己
  35. :0 HD
  36. * !^From: .*@mydomain.net.tw.*
  37. * !^Received: .*211\.72\.21[0-1]\..*
  38. * ^Message-Id: .*@mydomain.net.*
  39. {
  40. :0 fw
  41. | echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','發信軟體','Message-ID 為 mydomain')"    | $MYSQL

  42. :0
  43. /dev/null
  44. }

  45. # spamcop 的檢舉信回函轉存 mysql, 再以程式去 submit form
  46. :0 H
  47. * ^Subject: .*SpamCop has accepted.*
  48. {
  49.         :0 fw
  50.         | ( echo "insert into SPAMCOP_ID(SPAM_ID) values('$SPAMID')" | $MYSQL)

  51.         :0
  52.         /dev/null
  53. }

  54. # 一些大的廣告信商
  55. :0 HD
  56. * (^From:|^Received:|Return-Path:) .*(mailserver.idv.tw|mailserver.com|worldad.net|mailnews.com.tw|rayman.com.cn).*
  57. {
  58.         :0 fw
  59.         | 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

  60.         :0
  61.         /dev/null
  62. }


  63. # 收信人為數字型態
  64. :0 HD
  65. * ^To: .*[0-9][0-9].txt.*
  66. {
  67.         :0 fw
  68.         | echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','發信軟體','數字型收件者')"    | $MYSQL

  69.         :0
  70.         /dev/null
  71. }

  72. # From: user@mydomain.net.tw 但不為自己人
  73. :0 HD
  74. * ^From: .*@mydomain.net.tw.*
  75. * !^Received: .*211\.72\.21[0-1]\..*
  76. {
  77.         :0 fw
  78.         | (username=${FROM%%@*};if [ -d /home/$username ] ; then formail -A "Bogus: No"; else formail -A "Bogus: Yes";  echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','寄件人不存在','$FROM ')" | $MYSQL ;fi  );

  79.         :0
  80.         * ^Bogus: Yes
  81.         /dev/null
  82. }


  83. # 主旨過濾,資料存?mysql
  84. :0 HD
  85. * ! ^From: .*@mydomain.net.tw.*
  86. {
  87. patten=`echo "select concat(\"'\",PATTEN,\"'\") from SPAM_PATTEN where USERNAME='$LOGNAME' and instr('$SUBJ',PATTEN)"|$MYSQL | grep -v 'PATTEN'| tr '\n' ','`
  88. patten2=`echo $patten | sed -e "s/'//g"`

  89.         :0 fw
  90.         * ? test -n "$patten"
  91.         | ( formail -A "Spam: $patten" ; \
  92.         echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','符合特定字串','$patten2'); update SPAM_PATTEN set CNT=CNT+1 where USERNAME='$LOGNAME' and PATTEN in ($patten ''); " | $MYSQL ;\
  93.         )

  94.         :0
  95.         * ^Spam: .*
  96.         /dev/null
  97. }

  98. # RBL 過濾, rbl doamin 存於 mysql
  99. :0
  100. * ! ^From: .*@(mydomain.net.tw|mydomain.net).*
  101. * ! ^Received: .*159\.226\.*
  102. {
  103. rbl=`for spam in $(echo "select RBL_DOMAIN from SPAM_SOURCE order by SN"| $MYSQL | grep -v 'RBL_DOMAIN'); do  rbl=$(host $PTR.$spam| grep 'has address'); test -n "$rbl" && echo $PTR.$spam && break; done`

  104.         :0 fw
  105.         |( test -n "$rbl" && (echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','來自 RBL IP','$rbl.$spam')" | $MYSQL) && formail -A "Spam: From_RBL $rbl.$spam" )

  106.         :0
  107.         * ^Spam: .*
  108.         /dev/null
  109. }

复制代码


結果呈現:
http://211.72.210.251/spamcop.html

最近30天:
來自 RBL IP 5061 25.31%
寄件人不存在 911 4.56%
符合特定字串 3845 19.23%
發信軟體 10166 50.84%
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP