sendmail 如何配置啟用procmail 急 在線等謝謝
另外,阻止主旨是漢語的但是顯示亂碼,可以阻止掉嗎.謝謝
《解決方案》
sendmail 預設本來就是 procmail 了,除非你故意換掉
中文可以簡單檔下來,不過你需要一個程字做轉換
#!/usr/bin/perl
# program name: parser_subj
$sub=join(" ",@ARGV);
if ($sub=~ /=\?\S+\?\l(\S)\?/) {
if ($1 =~ //) {
$sub=decode_qp($sub);
}
elsif ($1 =~ //) {
$sub=decode_base64($sub);
}
}
elsif ($sub=~ /=/) {
$sub=decode_qp($sub);
}
$subject.=$sub;
$subject=~s/\'/\\\'/g;
$subject=~s/\"/\\\"/g;
print $subject;
sub decode_qp {
my($string) = @_;
@buffer=split(/\?/,$string);
$string = $buffer if ($buffer ne "");
$string =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
$string =~ /\?=(.*)/;
$string =~ tr/_/ /;
$buffer=~s/^=//;
$buffer=~s/=$//;
$string="$buffer$string$buffer";
return($string);
}
sub decode_base64 {
my($string) = @_;
my($string2);
@buffer=split(/\?/,$string);
$string = $buffer if ($buffer ne "");
$string =~ s/=+$//;
$string =~ tr|A-Za-z0-9+/| -_|;
while($string =~ /(.{1,60})/gs) {
my($string3) = chr(32+length($1)*3/4);
$string2 .= unpack("u",$string3 . $1 );
}
$buffer=~s/^=//;
$buffer=~s/=$//;
$string2="$buffer$string2$buffer";
return($string2);
}
procmail 可是非常古老的東西,你若不需要實在不用費心去研究,用 spamassassin 會簡單許多
# filename:$HOME/.procmailrc
PATH=$PATH
SHELL=/bin/sh
MAILDIR=/var/spool/mail
VERBOSE=yes
LOGABSTRACT=all
SENDMAIL=/usr/sbin/sendmail
LOGFILE=$HOME/procmail/procmail.log
FILE=`echo $HOME`/procmail/mail_folder/mail-`date +%Y%m%d%H%I%S`-`echo $$`.eml
# 取主旨
tmp=`formail > $FILE; chmod 644 $FILE`
tmp=`formail -zxSubject:`
# 解主旨,還原base64/qp 為原來的字
SUBJ=`/etc/parser_subj "$tmp"| sed -e "s/[\$,\(,\),\',\\]//g"`
# 取 From/To
FrOM=`formail -zxFrom:| sed -e 's/.*<\(.*\)>.*/\1/g'`
TO=`formail -zxTo:|tr ',' '\n'| sed 's/\(.*\) \(.*\)/\2/'`
# 取 IP
IP=`formail -zxReceived:|grep ^from|sed -e 's/.*\[\(.*\)\.\(.*\)\.\(.*\)\.\(.*\)\].*/\1.\2.\3.\4/g'|head -1`
# 取 IP 反向排列以進行 RBL 檢查
PTR=`formail -zxReceived:|grep ^from|sed -e 's/.*\[\(.*\)\.\(.*\)\.\(.*\)\.\(.*\)\].*/\4.\3.\2.\1/g'|head -1`
# 郵件大小
MAIL_SIZE=`formail | wc -c | awk '{print $1}'`
# MYSQL 連接參數
MYSQL="mysql -h host -u abel -pXXXXXX procmail"
# 取 Message-ID
MESSAGE_ID=`formail | grep -i '^Message-ID:'|head -1 | sed -e 's/.*: \(.*\)/\1/g'|sed -e 's/[<>]//g' `
# 這是取回來的信件中特定條件
:0 H
* ^X-return:
/var/spool/mail/$LOGNAME
# 白名單. 這個白名單是 by user 的,$ORGMAIL 是 procmail 的預設變數,即信箱
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 "aaazzzaaazzz"`
:0 H
* $($WHITE_LIST)
$ORGMAIL
########### 上面為優先條件,以確認能把一下信收下來
# spamassassin 評為負分,表示命中某個白名單
:0 HD
* X-Spam-Status: NO, -
$ORGMAIL
# 是 Spamassassin 認為的廣告信
:0 HD
* X-Spam-Status: YES
{
# 取分數值
SCORE=`formail -zxX-Spam-Status| grep -v ' \*' |sed -e 's/YES, \(.*\)>=.* (\(.*\))/\1;\2/g' | sed -e 's/;/ /g'`
# 取評分項目
SCORE_DETAIL=`formail | grep ' \*'`
# 把這封信的資訊存入 MYSQL ,因為最前面巳另存新檔了,所以資訊都記下來供報表使用
:0 fw
| (echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN,IP,MAIL_SIZE,MESSAGE_ID ) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','分數太高','$SCORE','$IP',$MAIL_SIZE,'$MESSAGE_ID')" | $MYSQL;echo "insert into REPORT(MESSAGE_ID,REPORT) values('$MESSAGE_ID','$SCORE_DETAIL')" |$MYSQL)
:0
/dev/null
}
# Message-id 為 Local MTA , 表示信件為直接寄達,沒有經過其他 MTA,視為 Spam
0 H
* !^From: .*@twnic.net.tw.*
* !^Received: .*(211\.72\.21\.|127.0.0.1|local).*
* ^Message-Id: .*@twnic.net.*
{
:0 fw
| ( echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN,IP,MAIL_SIZE ) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','發信軟體','Message-ID 為 TWNIC','$IP',$MAIL_SIZE)" | $MYSQL )
:0
/dev/null
}
# 取得 User 設定的主旨進行 Subject 比對,若 Match 則檔下來進 MYSQL
:0 HD
* ! ^From: .*@twnic.net.tw.*
{
patten=`echo "select concat(\"'\",PATTEN,\"'\") from SPAM_PATTEN where USERNAME='$LOGNAME' and instr('$SUBJ',PATTEN)"|$MYSQL | grep -v 'PATTEN'| tr '\n' ','`
patten2=`echo $patten | sed -e "s/'//g"`
:0 fw
* ? test -n "$patten"
| ( formail -A "Spam: $patten" ; \
echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN ,IP,MAIL_SIZE) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','符合特定字串','$patten2','$IP',$MAIL_SIZE); update SPAM_PATTEN set CNT=CNT+1 where USERNAME='$LOGNAME' and PATTEN in ($patten ''); " | $MYSQL ;\
)
:0
* ^Spam: .*
/dev/null
}
# RBL 查詢,由資料庫取得 RBL Domain 進行比對
:0
* ! ^From: .*@(twnic.net.tw|twnic.net).*
* ! ^Received: .*159\.226\.*
{
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`
:0 fw
|( test -n "$rbl" && (echo "insert into SPAM(MAIL_FROM,RCPT_TO,SUBJ,FILE_NAME,MAIL_TYPE,USERNAME,REASON,PATTEN,IP,MAIL_SIZE ) values('$FROM ','$TO ','$SUBJ ','$FILE',1,'$LOGNAME','來自 RBL IP','$rbl.$spam','$IP',$MAIL_SIZE)" | $MYSQL) && formail -A "Spam: From_RBL $rbl.$spam" )
:0
* ^Spam: .*
/dev/null
}
報表:
http://211.72.210.251/antispam.html
這些東西我巳經用五年了,到現在都還很好用,上半年多加了一個 mimedefang , 功能更好了
《解決方案》
太謝謝abel教授.有時間跟您好好請教
《解決方案》
abel教授 我設置好了procmailrc文件如下
:0
* ^Subject:.4*
{
:0
/dev/null
}
結果所有的郵件都收不到了
不知道怎麼回事,請指教.謝謝