#!/usr/local/bin/perl # a simple email filer designed for qmail/vpopmail # modify stuff under the ####### below (approx. line 50) use strict; use Mail::VRFY; use Mail::vpopmail; my $domain = $ENV{HOST} || die "environment problem: NULL HOST\n"; my $dirty = $ENV{RECIPIENT} || die "environment problem: NULL RECIPIENT\n"; (my $local = $dirty) =~ s/^${domain}-//; my $recipient = $local . '@' . $domain; my $vrfy = Mail::VRFY::CheckAddress( addr => $recipient, method => 'syntax' ); if($vrfy){ my $english = Mail::VRFY::English($vrfy); warn "problem with recipient [$recipient]: $english\n"; exit 111; # so it stays in queue; you can comment the vrfy code manually } my %header; my $field; my $folder; my $i = 0; my @lines; while(){ push @lines, $_; last if(/^\s*$/ || $i >= 100); chomp; my $value; if(/^([^:]+)\s*:\s*(.+)/){ ($field,$value) = ( lc($1),$2 ); $header{$field} = $value; }elsif(/^\s+(.+)/){ $value = $1; $header{$field} .= $value; }else{ # invalid email header warn "don't know how to filter message: [$_]\n"; %header = (); last; } $i++; } ###################################################################### # IMAP folders start with a DOT and are [a-Z0-9\._-] if( $recipient eq 'test1@example.com' ){ if($header{from} eq 'evil@example.com'){ # just bounce his mail exit 100; }elsif($header{from} eq 'theresa@gmail.com'){ $folder = '.from_theresa'; }elsif($header{subject} =~ /\[PLUG\]/){ $folder = '.plug'; }elsif($header{x-spam-status} =~ /\*\*\*\*\*/){ $folder = '.spam'; } }elsif( $recipient eq 'geoff@example.com' ){ } # else it gets delivered to normal Inbox ###################################################################### my $vchkpw = Mail::vpopmail->new(); my $maildir = $vchkpw->userinfo( email => $recipient, field => 'maildir' ); $maildir .= '/Maildir'; $maildir .= "/$folder" if($folder); unless( -d $maildir ){ system( '/var/qmail/bin/maildirmake', $maildir ); } open(MDD, "| /usr/local/bin/maildirdeliver $maildir/" ) || die "cannot fork maildirdeliver: $!\n"; foreach my $line (@lines){ print MDD; } while(){ print MDD; } close MDD; my $code = $? >> 8; # we treat all disk delivery errors as temporary.. my $xcode = $code ? 111 : 0; exit $xcode;