Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: converted to 1.6 markup

...

No Format
sub check_example() {
    my ( $self, $pms ) = @_;
    ...
    #You do all your tests and whatever else here
    ...
    #Now we assume that the score you calculated is in $score
    

    #optional: #Ifchange the scoredescription isfor 0,report thenand yousummary
 don't need to domy anything (obviously)

    if($score) {$description = $pms->{conf}->{descriptions}->{EXAMPLE_RULE_NAME};
    $description .= " -- #Fetchwith the description of your rule from the configuration filescore $score";
        my $description = $pms->{conf}->{descriptions}->{EXAMPLE_RULE_NAME} = $description;

    #If the score is 0, then you don't need to do anything (obviously)
    if($score) {
        #The magic call
        $pms->_handle>got_hit("EXAMPLE_RULE_NAME", $score, "HEADER: ", $description score => $score);

        #Yet another magic call
        for my $set (0..3) {
	    $pms->{conf}->{scoreset}->[$set]->{"EXAMPLE_RULE_NAME"} =
                                                   sprintf("%0.3f", $score);
        }
    }
    
    return 0;
}

And thats it. The

No Format
 _handlegot_hit ($rule, $score, $area, $description%params) 

call will trigger a hit for the specified rule with the specified score. Area means for example BODY or HEADER, so this has to be changed according to what you are doing. Description is obvious, but in our example, we fetch the description from the configuration file, so you don't have to hardcode the description. Feel free to add additional dynamic data to the description, for example the ammount of hits or other useful informations.(See Mail::SpamAssassin::PerMsgStatus for other possible params.)

The

No Format
 return 0; 

is important because that will make sure that the actual rule that we defined earlier with the

No Format
 eval:check_example() 

never evaluates to true so it doesn't score. It doesn't need to score because the actual scoring is completely being done inside the subroutine. So even if you defined a score in the configuration file earlier, it would never be used.

The rule description is accessible with

No Format
 $pms->{conf}->{descriptions}->{EXAMPLE_RULE_NAME} 

. It is usually set by

No Format
 describe EXAMPLE_RULE_NAME 

in the rules file but can also be changed at runtime. (actually, changing this at runtime is not recommended and may not be supported in future versions; I'm not sure it even works in SA 3.2.0. if you want to do something similar, it would be better to open an enhancement request on our bugzilla so we can come up with a proper API. --jm)

Setting

No Format
 $pms->{conf}->{scoreset}->[$set]->{"EXAMPLE_RULE_NAME"} 

...

lets the dynamic score appear in the template tag _TESTSSCORES_, which might be used for the X-Spam-Status line. (The for loop is necessary to set all 4 values, for their explanation see \[http://spamassassin.apache.org/full/3.1.x/doc/Mail_SpamAssassin_Conf.html Mail::SpamAssassin::Conf\] item {{score SYMBOLIC_TEST_NAME n.nn}} )

The

No Format
 return 0; 

is important because that will make sure that the actual rule that we defined earlier with the

No Format
 eval:check_example() 

never evaluates to true so it doesn't score. It doesn't need to score because the actual scoring is completely being done inside the subroutine. So even if you defined a score in the configuration file earlier, it would never be used. ) (again, changing the {scoreset} values is not recommended and probably will not work in future versions! please talk about this via the bugzilla. --jm (see http://issues.apache.org/SpamAssassin/show_bug.cgi?id=5463))