spamassassin note is good enough now that dspam has no need to parse headers. Yay. --- plugins/dspam | 44 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-)
diff --git a/plugins/dspam b/plugins/dspam index b86583e..4bc3203 100644 --- a/plugins/dspam +++ b/plugins/dspam @@ -272,16 +272,15 @@ sub dspam_reject { my ($class, $probability, $confidence) = $self->get_dspam_results( $transaction ); if ( $reject eq 'agree' ) { - my ($sa_is_spam, $sa_score, $sa_autolearn) - = $self->get_spamassassin_results($transaction); + my $sa = $transaction->notes('spamassassin' ); - if ( ! $sa_is_spam && ! $class ) { + if ( ! $sa->{is_spam} && ! $class ) { $self->log(LOGWARN, "cannot agree: SA or dspam results missing"); return (DECLINED) }; - if ( $class eq 'Spam' && $sa_is_spam eq 'Yes' ) { - $self->log(LOGWARN, "agreement: SA: $sa_is_spam, dspam: $class"); + if ( $class eq 'Spam' && $sa->{is_spam} eq 'Yes' ) { + $self->log(LOGWARN, "agreement: SA: $sa->{is_spam}, dspam: $class"); return Qpsmtpd::DSN->media_unsupported('dspam says, no spam please') }; @@ -317,29 +316,6 @@ sub get_dspam_results { return ($class, $probability, $confidence); }; -sub get_spamassassin_results { - my ($self, $transaction) = @_; - - if ( $transaction->notes('spamassassin' ) ) { - return split(':', $transaction->notes('spamassassin' ) ); - }; - - my $sa_status = $transaction->header->get('X-Spam-Status') or do { - $self->log(LOGERROR, "no X-Spam-Status header"); - return; - }; - chomp $sa_status; - - my ( $is_spam,undef,$score,$required,$autolearn ) = - $sa_status =~ /^(yes|no), (score|hits)=([\d\.\-]+) required=([\d\.\-]+) autolearn=([\w]+)/i; - - $self->log(LOGINFO, "SA: $is_spam; $score of $required; $autolearn"); - - $transaction->notes('spamassassin', "$is_spam:$score:$autolearn:$required"); - - return ($is_spam, $score, $autolearn, $required); -}; - sub get_filter_cmd { my ($self, $transaction, $user) = @_; @@ -349,18 +325,18 @@ sub get_filter_cmd { #$self->log(LOGDEBUG, "attempting to learn from SA"); - my ($is_spam, $score, $autolearn) = $self->get_spamassassin_results($transaction); - return $default if ! $is_spam; + my $sa = $transaction->notes('spamassassin' ); + return $default if ! $sa || ! $sa->{is_spam}; - if ( $is_spam eq 'Yes' && $score < $min_score ) { - $self->log(LOGNOTICE, "SA spam score of $score is less than $min_score, skipping autolearn"); + if ( $sa->{is_spam} eq 'Yes' && $sa->{score} < $min_score ) { + $self->log(LOGNOTICE, "SA spam score of $sa->{score} is less than $min_score, skipping autolearn"); return $default; }; - if ( $is_spam eq 'Yes' && $autolearn eq 'spam' ) { + if ( $sa->{is_spam} eq 'Yes' && $sa->{autolearn} eq 'spam' ) { return "$dspam_bin --user $user --mode=tum --source=corpus --class=spam --deliver=summary --stdout"; } - elsif ( $is_spam eq 'No' && $autolearn eq 'ham' ) { + elsif ( $sa->{is_spam} eq 'No' && $sa->{autolearn} eq 'ham' ) { return "$dspam_bin --user $user --mode=tum --source=corpus --class=innocent --deliver=summary --stdout"; }; -- 1.7.9.6