After a few more hours of hacking away at this, I finally solved it!
I was actually on the right track when I mentioned the $subject_tag
parsing code on line 16373 in my previous email. That is in fact the
code that gets executed for $sa_spam_subject_tag as well. The reason it
wasn't working for me was that the sprintf statement was preceded by
"1+". I can't believe I missed this. Since the sprintf was being
interpreted first and then having 1 added to it, this was causing perl
to convert the string back to a number, thus wiping out the formatting I
had applied in sprintf. Ultimately I changed this line:
{ $1 eq 'SCORE' ? (1+sprintf("%.3f",$spam_level))
To this, so the addition would be done before the sprintf formatting:
{ $1 eq 'SCORE' ? (sprintf("%07.3f",$spam_level+1))
...and now my subject line is being formatted as I wanted, with the
score zero padded.
On 3/28/2017 11:24 PM, Jeff Morris wrote:
I posted about this last year but wasn't able to find a solution, so
I'm revisiting it.
I have amavis configured to add the spam score to the subject line of
spammy messages via the following variable in amavisd.conf:
$sa_spam_subject_tag = '[SPAM: _SCORE_] ';
This gives me subject lines like the following examples:
Subject: [SPAM: 21.21] Spammy Subject
Subject: [SPAM: 7.13] Another Spammy Subject
I would like the scores to be zero-padded, so I can easily sort the
spam in my email client (Thunderbird) by subject, so I can look for
false-positives with lowish scores. For example, I would like the
above examples to be changed to this:
Subject: [SPAM: 007.13] Another Spammy Subject
Subject: [SPAM: 021.21] Spammy Subject
When I posted here last year someone suggested changing "_SCORE_" in
my amavisd.conf to "_SCORE(000)_", however this does not work. It does
not get parsed, instead it gives me the literal "_SCORE(000)_" in my
subject lines, like this:
Subject: [_SCORE(000)_] Spammy Subject
Subject: [_SCORE(000)_] Another Spammy Subject
I've spent quite a bit of time trying to figure this out and have made
no progress.
Could someone explain to me, in layman's terms, what amavisd does with
the contents of the $sa_spam_subject_tag variable? Does it pass this
to Spamassassin (in which case the problem I'm having would be with
Spamassasin, rather than Amavis), or does Amavis parse this and
replace it? I really don't understand the flow here through Amavis.
I've done a fair amount of Perl scripting in my time, but I don't
recognize the underscores as a Perl construct, and strings in
single-quotes aren't parsed by Perl, so I really don't understand
where the contents of this variable are getting parsed? I've been
looking at /usr/sbin/amavisd, and it looks like _SCORE_ is some sort
of amavisd macro. For example, on line 12304 I see this:
SCORE => sub {macro_score($MSGINFO,undef,@_)}
And on line 11849 I see the definition for the above macro_score
function, which looks like is should parse "_SCORE(000)_", but as I
said above, it doesn't when it's used in $sa_spam_subject_tag. I also
see on line 16373 code to parse the contents of $subject_tag (not
$sa_spam_subject_tag). This code does NOT appear to be capable of
parsing the "_SCORE(000)_" syntax, so I tried changing the sprintf
format on line 16377 from "%.3f" to "%07.3f", but this had no effect,
so apparently $subject_tag and $sa_spam_subject_tag are not equivalent.
This is getting really frustrating, as it seems like such a simple
change, but I've spent many hours trying different configuration
options and digging through amavis' source code off and on over the
past year trying to understand it, but still don't feel like I've made
any progress. I'd really appreciate any help anyone could give.
I'm running CentOS 7.3.1611, amavisd-new-2.10.1-5, and
spamassassin-3.4.0-2.
Thanks!