[Mimedefang] Rejecting Some Recipients in filter_recipient() for Relay

imacat imacat at mail.imacat.idv.tw
Fri Mar 23 10:29:18 EST 2007


On Fri, 23 Mar 2007 10:14:37 -0400
Kris Deugau <kdeugau at vianet.ca> wrote:
> imacat wrote:
> >     The gateway has rejected the 2 recipients, but it still ask the
> > intranet mail server for these 2 rejected recipients.  Why?
> Post your filter_recipient;  it sounds like you're not doing something 
> correctly.  I've used this on several systems without trouble.

    My filter_recipient() is attached below.  /etc/mail/local-users is
the available local users and aliases' list I synchronized from the
intranet every hour.  The /etc/mail/access has some problem with
recipient filtering so I have to filter them here.  Net::DNS and
Net::IPv4Addr is for my other tests.

    I suppose there shouldn't be any trouble here, since all it want is
a proper return list, and I did not mess up with global variables.

    Thank you very much in advance.

use Net::DNS qw();
use Email::Address qw();
use Net::IPv4Addr qw(ipv4_in_network);
# filter_recipient: Filter by the RCPT_TO: smtp talk
# See mimedefang-filter(5)
sub filter_recipient($$$$$$$$$) {
    local ($_, %_);
    my ($recipient, $sender, $ip, $hostname, $first, $helo, $rcpt_mailer, $rcpt_host, $rcpt_addr);
    my ($addr, $file, $FH, %locals, %denies);
    ($recipient, $sender, $ip, $hostname, $first, $helo, $rcpt_mailer, $rcpt_host, $rcpt_addr) = @_;
    %locals = qw();
    %denies = qw();
    foreach my $addr (Email::Address->parse($recipient)) {
        # Our targets are Pristine's local recipients
        next unless $addr->host =~ /(?<![^\.])pristine\.(?:com\.tw|net)$/i;
        # Read the local recipients' list if not read yet
        if (scalar(keys %locals) == 0) {
            $file = "/etc/mail/local-users";
            # Only work if the local recipients' list exists
            if (!-e $file) {
                md_syslog("warning", "filter_recipient(): $file: no such file or directory.");
                return ("CONTINUE", "ok");
            }
            if (!-f $file) {
                md_syslog("warning", "filter_recipient(): $file: not a file.");
                return ("CONTINUE", "ok");
            }
            if (!-r $file) {
                md_syslog("warning", "filter_recipient(): $file: permission denied.");
                return ("CONTINUE", "ok");
            }
            if (!open $FH, $file) {
                md_syslog("err", "filter_recipient(): $file: $!.");
                return ("CONTINUE", "ok");
            }
            %locals = map { lc $_ => 1 } split /\n/, join "", <$FH>;
            if (!close $FH) {
                md_syslog("err", "filter_recipient(): $file: $!.");
                return ("CONTINUE", "ok");
            }
        }
        # Check against the local recipients' list
        if (!exists $locals{lc $addr->user}) {
            # The reason is obvious that additional logging is not necessary
            return ("REJECT", "User unknown", 550, "5.1.1", 0);
        }
        # Check against the deny list
        # Read the deny list if not read yet
        if (scalar(keys %denies) == 0) {
            $file = "/etc/mail/access";
            # Only work if the access list exists
            return ("CONTINUE", "ok") unless -e $file && -f $file && -r $file;
            if (!open $FH, $file) {
                md_syslog("err", "filter_recipient(): $file: $!.");
                return ("CONTINUE", "ok");
            }
            %denies = map { lc $_ => 1 } grep s/^To:([^\t\@]+)\@\t+REJECTSPAM$/$1/, split /\n/, join "", <$FH>;
            if (!close $FH) {
                md_syslog("err", "filter_recipient(): $file: $!.");
                return ("CONTINUE", "ok");
            }
        }
        # Check against the deny list
        if (exists $denies{lc $addr->user}) {
            # The reason is obvious that additional logging is not necessary
            return ("REJECT", "User unknown", 550, "5.1.1", 0);
        }
    }
    # OK
    return ("CONTINUE", "ok");
}

--
Best regards,
imacat ^_*' <imacat at mail.imacat.idv.tw>
PGP Key: http://www.imacat.idv.tw/me/pgpkey.txt

<<Woman's Voice>> News: http://www.wov.idv.tw/
Tavern IMACAT's: http://www.imacat.idv.tw/
TLUG List Manager: http://lists.linux.org.tw/cgi-bin/mailman/listinfo/tlug
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.roaringpenguin.com/pipermail/mimedefang/attachments/20070323/5fa3920e/attachment.bin


More information about the MIMEDefang mailing list