---
 plugins/dspam        |   28 ++++++++++++++++++++++------
 t/plugin_tests/dspam |   13 +++++++++++++
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/plugins/dspam b/plugins/dspam
index 84d1d7d..edb7fce 100644
--- a/plugins/dspam
+++ b/plugins/dspam
@@ -131,12 +131,21 @@ and 1.0 is 100% confidence.
 If dspam's confidence is greater than or equal to this threshold, the
 message will be rejected. The default is 1.00.
 
+  dspam reject .95
+
+To only reject mail if dspam and spamassassin both think the message is spam,
+set I<reject agree>.
+
 =head2 reject_type
 
- reject_type [ temp | perm ]
+ reject_type [ perm | temp | disconnect ]
 
-By default, rejects are permanent (5xx). Set this to temp if you want to
-defer mail instead of rejecting it with dspam.
+By default, rejects are permanent (5xx). Set I<reject_type temp> to
+defer mail instead of rejecting it.
+
+Set I<reject_type disconnect> if you'd prefer to immediately disconnect
+the connection when a spam is encountered. This prevents the remote server
+from issuing a reset and attempting numerous times in a single connection.
 
 =head1 MULTIPLE RECIPIENT BEHAVIOR
 
@@ -172,7 +181,7 @@ sub register {
 
     $self->{_args} = { %args };
     $self->{_args}{reject} = defined $args{reject} ? $args{reject} : 1;
-    $self->{_args}{reject_type} = $args{reject_type} || 'perm';
+    $self->{_args}{reject_type} ||= 'perm';
 
     $self->register_hook('data_post', 'dspam_reject');
 }
@@ -319,8 +328,8 @@ sub dspam_reject {
 
     # dspam is more than $reject percent sure this message is spam
     $self->log(LOGINFO, "fail: $d->{class}, ($d->{confidence} confident)");
-    my $deny = $self->{_args}{reject_type} eq 'temp' ? DENYSOFT : DENY;
-    return Qpsmtpd::DSN->media_unsupported($deny,'dspam says, no spam please');
+    my $deny = $self->get_reject_type();
+    return Qpsmtpd::DSN->media_unsupported($deny, 'dspam says, no spam 
please');
 }
 
 sub dspam_reject_agree {
@@ -403,4 +412,11 @@ sub get_filter_cmd {
     return $default;
 };
 
+sub get_reject_type {
+    my $self = shift;
+    my $deny = $self->{_args}{reject_type} or return DENY;
 
+    return $deny eq 'temp'       ? DENYSOFT
+         : $deny eq 'disconnect' ? DENY_DISCONNECT
+         : DENY;
+};
diff --git a/t/plugin_tests/dspam b/t/plugin_tests/dspam
index 85b2f9b..b768c44 100644
--- a/t/plugin_tests/dspam
+++ b/t/plugin_tests/dspam
@@ -14,6 +14,7 @@ sub register_tests {
     $self->register_test('test_get_filter_cmd', 5);
     $self->register_test('test_get_dspam_results', 6);
     $self->register_test('test_dspam_reject', 6);
+    $self->register_test('test_reject_type', 3);
 }
 
 sub test_dspam_reject {
@@ -111,3 +112,15 @@ sub test_get_filter_cmd {
         "smtpd, spam" );
 };
 
+sub test_reject_type {
+    my $self = shift;
+
+    $self->{_args}{reject_type} = undef;
+    cmp_ok( $self->get_reject_type(), '==', DENY, "default");
+
+    $self->{_args}{reject_type} = 'temp';
+    cmp_ok( $self->get_reject_type(), '==', DENYSOFT, "defer");
+
+    $self->{_args}{reject_type} = 'disconnect';
+    cmp_ok( $self->get_reject_type(), '==', DENY_DISCONNECT, "disconnect");
+};
-- 
1.7.9.6

Reply via email to