Training des BAYES Filters

Carsten Rosenberg cr at ncxs.de
Di Mär 1 08:46:53 CET 2022


Hey

On 26.02.22 17:04, Achim Lammerts via Postfixbuch-users wrote:
> 
>> Vom Per-User Bayes bin ich nicht mehr so überzeugt. Man vervielfacht 
>> seine Datenhaltung und im Endeffekt liegen die Statistiken sehr nah am 
>> globalen Bayes. Dadurch dass man eine Mindestzahl an gelernten Mails 
>> (200+) und das für HAM als auch SPAM braucht, ist der Einfluss 
>> angelernter Mail für den User außerdem recht klein. Außer der User 
>> lernt schon zu Beginn eine gewisse Zahl an HAM und SPAM.
> 
> Ich hatte Dutzende E-Mailadressen mit ein paar gelernten E-Mails 
> angesammelt und der Filter wurde nie getriggert ;-)
> Man kann zwar mit dem Parameter -u den rspamc anweisen, auf einen 
> bestimmten Nutzer hin zu trainieren, aber bekommt rspamd diese Info, 
> wenn er die Mail vom MTA entgegen nimmt? Postfix prüft ja vor Übergabe 
> an den Milter gegen die virtual alias table, sonst würde ja 
> reject_unlisted_recipient nicht vorab schon greifen.
> Bei "per user" hatte ich angenommen, dass der BAYES pro Mailbox lernt 
> und nicht pro Alias.

Das ist das min_learns in der Bayes Config. Meiner Meinung nach macht 
sein Setting kleiner 200 wenig Sinn für eine sinnvolle Statistik.

Milter und Postfix Restriktions werden parallel abgearbeitet. Rspamd 
startet den Scan aber erst beim end-of-body. Daher ist Postfix immer 
schneller. Die Virtual-Umschreibung passiert ja dann erst im cleanup, 
also wenn der Rspamd schon fertig gescannt hat. Vorher prüft Postfix nur 
ob er sich für diese Adresse zuständig fühlt.

Welche Adressen zu einem Account gehören, musst du Rspamd also extra 
zugänglich machen. Dann kannst du wie beim Parameter learn_condition 
auch bei per_user anstatt true eine Lua Funktion anhängen. (Das geht 
sogar auch bei autolearn=)

     per_user = <<EOD
return function(task)
     local rcpt = task:get_recipients(smtp)

if rcpt then
     one_rcpt = rcpt[1]
     if one_rcpt['domain'] then
         return one_rcpt['domain']
     end
end

Hier wird jetzt z.B. jeweils für die Domain des (1.) Empfängers gelernt 
und nicht mehr für jede Adresse einzeln.

> 
>> Rspamd verwendet nur ganz wenige Header, wobei Received und From/To 
>> nicht dabei sind. Ihr könnt also einfach die Mails direkt aus dem 
>> Postfach anlernen.
>>
>> https://rspamd.com/doc/usage_policy.html
>>
>> classify_headers = [
>>      "User-Agent",
>>      "X-Mailer",
>>      "Content-Type",
>>      "X-MimeOLE",
>> ];
> 
> Ich werde das mal genauer anschauen. Bei dem zuletzt genutzen 
> Lernmaterial habe ich mal sicherheitshalber alles raus genommen, was 
> mein Server in den Mails hinzugefügt hatte.
> 
> Der LOCAL_FUZZY ist da unproblematischer und arbeitet recht präzise. 
> Soweit ich weiß, checkt der nur den Body und keine Header, oder?
> Der FUZZY Filter erkennt auch den penetranten IMG-Spam sehr gut, auch 
> wenn das Bildmaterial neu komprimiert wurde. >

Fuzzy erstellt auch einen extra Header Hash, der aber unabhängig von den 
Mime-Part Hashed funktioniert. Im Code sind diese Header vordefiniert:

"Subject,Content-Type,Reply-To,X-Mailer";

Ein Subject Rewrite könnte also für ein nachträgliches Lernen also 
kontraproduktiv sein. Aber Subject Rewrite ist ja eh doof ;)

Viele Grüße

Carsten



Mehr Informationen über die Mailingliste Postfixbuch-users