2017/11/29
迷惑メール対策
最近、自宅に届く迷惑メールの量が急増しているのでドメイン単位で受信を拒否するスクリプトを作成した。
自宅メールサーバ環境では 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 ファイルが肥大してしまうのが難点なのだが迷惑メールは目に見えて減ったので重宝している。
トラックバック
https://blog.bsdhack.org/index.cgi/Computer/20171129.trackback