The current status file, in git, has the following entry:

  -plugin to reject mails from <> if it has multiple recipients.

  I hereby submit my plugin to handle this case for possible inclusion,
 under the same terms as the current qpsmtpd release.

  The plugin is available here:

    http://www.steve.org.uk/Software/qpsmtpd/check_bogus_bounce/

  Please find patch against git head below, adding the file and removing
 the TODO line from the status file.

Steve
--
http://stolen-souls.com/


diff --git a/STATUS b/STATUS
index 4a00dc6..81cf0df 100644
--- a/STATUS
+++ b/STATUS
@@ -59,8 +59,6 @@ Make a system for configuring the plugins per user/domain/...

   support databytes per user / domain

-plugin to reject mails from <> if it has multiple recipients.
-
 localiphost - support f...@[a.b.c.d] addresses

 Move dispatch() etc from SMTP.pm to Qpsmtpd.pm to allow other similar
diff --git a/plugins/check_bogus_bounce b/plugins/check_bogus_bounce
new file mode 100644
index 0000000..8652151
--- /dev/null
+++ b/plugins/check_bogus_bounce
@@ -0,0 +1,139 @@
+#!/usr/bin/perl -w
+
+=head1 NAME
+
+check_bogus_bounce - Check that a bounce message isn't bogus
+
+=head1 DESCRIPTION
+
+This plugin is designed to reject bogus bounce messages.
+
+In our case a bogus bounce message is defined as a bounce message
+which has more than a single recipient.
+
+=head1 CONFIGURATION
+
+Only a single argument is recognized and is assumed to be the default
+action.  Valid settings are:
+
+=over 8
+
+=item log
+
+Merely log the receipt of the bogus bounce (the default behaviour).
+
+=item deny
+
+Deny with a hard error code.
+
+=item denysoft
+
+Deny with a soft error code.
+
+=back
+
+=cut
+
+=head1 AUTHOR
+
+Steve Kemp
+--
+http://steve.org.uk/Software/qpsmtpd/
+
+=cut
+
+
+
+=begin doc
+
+Look for our single expected argument and configure "action" appropriately.
+
+=end doc
+
+=cut
+
+sub register
+{
+    my ( $self, $qp, $arg, @nop ) = (@_);
+
+    #
+    #  Default behaviour is to merely log.
+    #
+    $self->{ _action } = "log";
+
+    #
+    #  Unless one was specified
+    #
+    if ($arg)
+    {
+        if ( $arg =~ /^(log|deny|denysoft)$/i )
+        {
+            $self->{ _action } = $arg;
+        }
+        else
+        {
+            die "Invalid argument '$arg' - use one of : log, deny, denysoft";
+        }
+    }
+}
+
+
+=begin doc
+
+Handle the detection of bounces here.
+
+If we find a match then we'll react with our expected action.
+
+=end doc
+
+=cut
+
+sub hook_data_post
+{
+    my ( $self, $transaction ) = (@_);
+
+    #
+    # Find the sender, and return unless it wasn't a bounce.
+    #
+    my $sender = $transaction->sender->address || undef;
+    return DECLINED unless ( $sender =~ /^<>$/ );
+
+    #
+    #  Get the recipients.
+    #
+    my @to = $transaction->recipients || ();
+    return DECLINED unless ( scalar @to > 1 );
+
+
+    #
+    #  OK at this point we know:
+    #
+    #   1.  It is a bounce, via the null-envelope.
+    #   2.  It is a bogus bounce, because there are more than one recipients.
+    #
+    if ( $self->{ _action } =~ /^log$/i )
+    {
+        $self->log( LOGWARN,
+              $self->plugin_name() . " bogus bounce for :" . join( ",", @to ) 
);
+    }
+    elsif ( $self->{ _action } =~ /^deny$/i )
+    {
+        return ( DENY,
+               $self->plugin_name() . " determined this to be a bogus bounce" 
);
+    }
+    elsif ( $self->{ _action } =~ /^denysoft$/i )
+    {
+        return ( DENYSOFT,
+               $self->plugin_name() . " determined this to be a bogus bounce" 
);
+    }
+    else
+    {
+        $self->log( LOGWARN,
+                  $self->plugin_name() . " failed to determine action.  bug?" 
);
+    }
+
+    #
+    #  All done; allow this to proceed
+    #
+    return DECLINED;
+}

Reply via email to