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!


Reply via email to