#!/usr/bin/ruby SPAMIN="mail/spam-learn" SPAMOUT="mail/spam-learned" HAMIN="mail/ham-learn" HAMOUT="mail/ham-learned" $verbose = 0 if ARGV[0] == "-v" $verbose = 1 end def check_maildir(d) throw "#{d} is not a maildir" unless FileTest.directory?(d) throw "#{d} is not a maildir" unless FileTest.directory?(d+"/new") throw "#{d} is not a maildir" unless FileTest.directory?(d+"/cur") throw "#{d} is not a maildir" unless FileTest.directory?(d+"/tmp") true end def move(filename, to) basename = File.basename(filename) component = File.basename( File.dirname(filename) ) throw "Bad component '#{component}' in filename '#{filename}'." unless %w{cur new tmp}.include?(component) File.link(filename, to+"/"+component+"/"+basename) File.unlink(filename) end check_maildir SPAMIN check_maildir SPAMOUT check_maildir HAMIN check_maildir HAMOUT Dir[SPAMIN+"/new/*"].each do |filename| puts "learning #{filename}" if $verbose > 0 if system("sudo -H -u amavis sa-learn --spam < #{filename} > /dev/null") puts "moving #{filename}" if $verbose > 0 move(filename, SPAMOUT) else STDERR.puts "Learning of #{filename} failed." end end Dir[HAMIN+"/new/*"].each do |filename| puts "learning #{filename}" if $verbose > 0 if system("sudo -H -u amavis sa-learn --ham < #{filename} > /dev/null") puts "moving #{filename}" if $verbose > 0 move(filename, HAMOUT) else STDERR.puts "Learning of #{filename} failed." end end