歡迎您光臨本站 註冊首頁

sendmail 如何配置啟用procmail 急 在線等謝謝

←手機掃碼閱讀     火星人 @ 2014-03-05 , reply:0

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
}

結果所有的郵件都收不到了
不知道怎麼回事,請指教.謝謝

[火星人 ] sendmail 如何配置啟用procmail 急 在線等謝謝已經有791次圍觀

http://coctec.com/docs/service/show-post-45037.html