ヽ( ・∀・)ノくまくまー(2006-03-31) - 舞波デコヒーレンスの話ね。
/var/qmail/bin/condredirect spam@example.com /var/qmail/alias/filter/message_md5.pl |
下にあるスクリプト(message_md5.pl)を動かす。
とりあえず、これで複数のアドレスに来るspamをある程度減らせる。
もし、最初の2通も含めて処理したい*1のであれば、
適当なMaildirに一旦格納して、10分間隔くらいでfetchmailして、
転送先のアドレスに関する.qmailで
/var/qmail/bin/condredirect spam@example.com /var/qmail/alias/filter/message_md5.pl checkonly |
すればだいたい排除できるんでないかな?
#!/usr/bin/perl #init use strict; use Digest::MD5; use MIME::Parser; my $dir = '/var/qmail/alias/filter/'; #ログ等の保存先 my $maxcount = 2; #しきい値 my $file ="haches.in"; #ログファイル my $blacklistfile = "haches.bl"; #ブラックリスト #parse mail my $parse = MIME::Parser->new; $parse->output_under("/tmp"); my $entity= $parse->parse(\*STDIN); #make MD5 my $md5= Digest::MD5->new; my $hash = $md5->add(join("",@{$entity->body}))->hexdigest; my $from = $entity->head->get('From'); $from =~ s/\n//g; $from =~ s/\t//g; $parse->filer->purge; rmdir($parse->output_dir); #check blacklist if(open(FILE,$dir.$blacklistfile)) { while(my $line=<FILE>) { chomp($line); my ($last_from,$last_hash) = split(/\t/,$line); if($last_hash eq $hash) { print "found in blacklist\n"; close(FILE); exit(0); } } close(FILE); } exit(-1) if($ARGV[0] eq 'checkonly'); # check email-count; my $count = 1; if(open(FILE,$dir.$file)) { while(my $line=<FILE>) { chomp($line); my ($last_from,$last_hash) = split(/\t/,$line); if($last_hash eq $hash) { $count++; } if($count > $maxcount) { if(open(OUT,">>".$dir.$blacklistfile)) { print OUT $from."\t".$hash."\n"; close(OUT); close(FILE); print "seen over $maxcount\n"; exit(0); } last; } } close(FILE); } # write log if(open(FILE,">>".$dir.$file)) { print FILE $from."\t".$hash."\n"; close(FILE); } exit(-1);
perl詳しくないので、もっと奇麗な書き方とか
モジュール使わないやり方とかあったらフォローしてもらえると。
*1:自分はやったことないけど