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;
+}