#!/usr/local/bin/perl # # This filter, to be used with Majordomo (uses some supporting scripts), # will re-send mail messages to alternate addresses based on some # pattern match against the incoming mail headers. # # It was originally designed to split corporate broadcast email into # separate destinations based on the Subject: of the message, but it # can also match against other headers such as From. # # set our path explicitly $ENV{'PATH'} = "/bin:/usr/bin:/usr/ucb"; # Read and execute the .cf file $cf = $ENV{"MAJORDOMO_CF"} || "/etc/majordomo.cf"; while ($ARGV[0]) { if ($ARGV[0] eq "-C") { $cf = $ARGV[1]; shift(@ARGV); } if ($ARGV[0] eq "-D") { $delay = 1; } if ($ARGV[0] eq "-t") { $test = 1; } shift(@ARGV); } die("$cf not readable; stopped") unless -r $cf; die("require of majordomo.cf failed") unless require $cf; # 1.94 has this set in $CF already $sendmail_command = "/usr/lib/sendmail" unless $sendmail_command; chdir($homedir) || die("Can't chdir(\"$homedir\"): $!"); unshift(@INC, $homedir); require "majordomo.pl"; &ParseMailHeader(STDIN, *hdrs); $reply_to = &RetMailAddr(*hdrs); $reply_to = join(", ", &ParseAddrs($reply_to)); $in_reply_to = $hdrs{"message-id"} . ", from " . $hdrs{"from"}; # compare headers to filter table patterns # die("Cannot open filter table $0.cf") unless open(CF, "<$0.cf"); while () { next if /^#/; next if /^$/; chop; local($keyw,$pattern,$dest) = m/^([^:]+):\s*([^\t]*)\s*(.*)/g; next unless ($keyw && $pattern && $dest); $keyw =~ y/A-Z/a-z/; print "[$keyw, \"$pattern\", $dest]\n \"$hdrs{$keyw}\"\n" if $test; if ($hdrs{$keyw} =~ /$pattern/i) { $list = $dest; last; } } close(CF); while ($delay) { chop($hour = `date +%H`); last if ($hour < 8 || $hour >= 17); print "...sleeping\n" if $test; sleep(60*10); } if ($test) { print " -->$list\n"; exit; } exit(0) unless $list; open(MAIL, "|-") || &do_exec_sendmail(split(' ', "/usr/lib/sendmail -t -f$reply_to")); print MAIL <<"EOM"; To: $list From: $reply_to Subject: $hdrs{"subject"} In-Reply-To: $in_reply_to Reply-To: $reply_to EOM while () { print MAIL $_; } close(MAIL); exit 0;