Nov 29, 2017

迷惑メール対策

最近、自宅に届く迷惑メールの量が急増しているのでドメイン単位で受信を拒否するスクリプトを作成した。
自宅メールサーバ環境では mh (1) を利用しているので、迷惑メールは spam フォルダに格納する事を想定している。
メールの自動振り分け処理も mh に付属の slocal (1) コマンドを利用しているので、 迷惑メイルの送信元ドメインを ${HOME}/.maildelivery に格納する様にしている。

  1domains=/etc/postfix/generics-domains                   # 自分のドメインを格納しているファイル
  2spamdir=$HOME/.Mail/spam                                # 迷惑メールを格納しているディレクトリ (1メール1ファイル)
  3delivery=$HOME/.maildelivery                            # maildelivery ファイル
  4tmpdir=/tmp/spam.$$                                     # 一時ファイル
  5reject="/etc/postfix/reject"                            # postfix リジェクトファイル
  6count=0
  7
  8if [ $(ls -1 ${spamdir} | wc -l) -gt 0 ]
  9then
 10    # spam ディレクトリのメールファイルから From を取得
 11    for i in $(sed -n '/^From/ s/.*<.*@\(.*\)>.*/\1/gp' ${spamdir}/* | sort | uniq)
 12    do
 13        # From が自分のドメインに詐称されていない送信ドメインを maildelivery ファイルに "destroy" として追加
 14        grep -q ${i} ${domains} || grep -q "\"@${i}\"" ${delivery} || { printf "from\t\"@%s\"\t\t\tdestroy\tA\t-\n" $i; count=$((count + 1)); }
 15    done >> ${delivery}
 16
 17    # 迷惑メールがある場合
 18    if [ ${count} -gt 0 ]
 19    then
 20        # 迷惑メールの学習
 21        mkdir -p ${tmpdir}
 22        cp -r ${spamdir} ${tmpdir}
 23        sa-learn --spam ${tmpdir}
 24        rm -r ${tmpdir}
 25    fi
 26
 27    # 迷惑メール削除
 28    rmm all +spam
 29
 30    # reject ファイル作成
 31    awk '{
 32        if($1 == "from" && $3 == "destroy" && $2 !~ "@\"$"){
 33            gsub("[\"@]", "", $2)
 34            if ($2 ~ /.+\..+/)
 35                printf "%s DISCARD\n", $2;
 36        }
 37    }' ${delivery} > ${reject}
 38    # HASH 形式に変換
 39    postmap ${reject}
 40    # 再読み込み
 41    service postfix reload
 42fi
    

メールを処理する時に迷惑メールは spam フォルダに仕分ける必要はあるが、このスクリプトを crontab に仕込んでおけば mh (1) の spam フォルダに格納されているメールの送信元ドメインからのメールは拒否出来る様になる。
reject ファイルが肥大してしまうのが難点なのだが迷惑メールは目に見えて減ったので重宝している。

Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.