Rejecting spam at SMTP but forward it to its recipients

Richard Lithvall <[email protected]>
Newsgroups gmane.mail.exim.spamassassin
Message-ID <[email protected]>
Hi list members!

As the lazy postmaster I am I don't want to check every mail caught by
SA for false positives but I really want to reject the damn spam at SMTP
time.
Therefore I wrote this little perl hack delegating this responsibilty to
my users (they all use exim filters to file mail tagged as spam into a
Junk folder).

It works as follows.
- Configure SA-exim to save rejected mail into a directory
- Run the perl script attatched below from cron, let's say, once an hour
(as user mail or whoever that runs your exim)
- Inform your users how things work and their responsibilites to check
for false positives.

Please comment this script/hack and I'd really love to get some English
spelling/grammar check as well :-)

/Richard


#!/usr/bin/perl
$dir = "/var/spool/exim4/SApermrejectsave/new";
foreach $mail (<$dir/*>) {
        if(-f $mail){
                open(MAIL, $mail);
#               print "Working on: " . $mail . "\n";
                $from = <MAIL>;
                $from =~ s/^From\s(.+?)\s.+\n/$1/;
                while (<MAIL>){
                        if(/^X-SA-Exim-Rcpt-To:\s(.+)/){
                                @rcpts = split(/, /, $1);
                                last;
                        }
                        if(/^$/){
                                last;
                        }
                }
                open(BSMTP, "| /usr/sbin/exim4 -bS");
                print BSMTP "mail from:<" . $from . ">\n";
                foreach $rcpt (@rcpts){
                        print BSMTP "rcpt to:<" . $rcpt . ">\n";
                }
                print BSMTP "data\n";
                print BSMTP "X-Spam-Notice: This mail was rejected
during reception due to heuristic check marked it as spam,\n";
                print BSMTP "\tbut forwarded to You for checking for
false positives.\n";
                seek(MAIL, 0, 0);
                $throw_away_first_from_line = <MAIL>;
                while (<MAIL>){
                        if(/^\./){
                                print BSMTP ".";
                        }
                        print BSMTP;
                }
                close(MAIL);
                print BSMTP ".\n";
                print BSMTP "quit\n";
                close(BSMTP);
                unlink($mail);
        }
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.