Een gedeelde mailbox loopt vol. Op het adres dat op je website staat, komt van alles binnen: aanvragen, facturen, nieuwsbrieven waar niemand zich voor heeft aangemeld, en de bekende rommel.
De reflex is een spamfilter. Begrijpelijk, maar het echte risico zit aan de andere kant. Een filter dat één keer per maand een boekingsaanvraag weghaalt, kost je meer dan alle spam samen. En je merkt het niet, want je hoort gewoon niets meer van die klant.
Eén zin bepaalt het hele ontwerp
De opdrachtgever zei het bij de start zo: liever een keer een spammetje per ongeluk doorlaten dan een echte mail kwijtraken.
Dat is geen slap compromis. Het is een technische keuze met een naam. Je optimaliseert op een lage kans op een fout-positief, dus goede post die als spam eindigt, en je neemt daarvoor meer fout-negatieven op de koop toe, dus spam die doorkomt. Elke drempel, elk terugvalgedrag en elke bewaartermijn volgt uit die ene zin.
Het loont om dat op te schrijven vóór je begint. Anders eindig je met een filter dat scherp lijkt en waar niemand op durft te vertrouwen.
Wat de audit eerst opleverde
Voordat er één regel filtercode was geschreven, kwamen er drie dingen boven die los van spam al fout zaten.
Het ophalen las één map, en dat was de inbox. Wat de mailserver zelf als spam bestempelde, ging naar een aparte map die het systeem nooit opende. Er draaide dus al een filter waar niemand zicht op had. Dat is precies het scenario dat je wil voorkomen, en het was al waar.
De kopvelden werden bij het inlezen weggegooid. Alleen afzender, ontvanger, onderwerp, datum en berichtnummer bleven over. Juist de velden waar een oordeel op hoort te rusten, de uitkomst van SPF, DKIM en DMARC, het verzendende adres en het eigen oordeel van de mailserver, verdwenen. Zonder die velden is elke beslissing gokwerk op tekst alleen.
En "spam" was als label bewaard. Een gesprek heeft één label, dus wie spam aanvinkte, wiste het onderwerplabel. Een spamstaat hoort in een eigen veld.
Vier lagen, in deze volgorde
De eerste laag is een veiligheidslijst, en die wint altijd. Nooit spam: iedereen in het adresboek, elke klant, elke gebruiker van het systeem welke rol hij ook heeft, elk adres dat wij ooit zelf gemaild hebben, en elk gesprek waarin al een antwoord van ons staat. Dat is de goedkoopste en sterkste bescherming tegen het verliezen van echte post, en de gegevens stonden al in huis. De lijst wordt bij elke beoordeling opnieuw opgezocht, want een klant die vandaag boekt hoort er morgen op te staan.
De tweede laag zijn de harde feiten uit de kop. Geen mening, alleen wat verifieerbaar is: de uitslag van SPF, DKIM en DMARC, het oordeel dat de mailserver zelf al velde, het verzendende adres tegen de bekende blokkeerlijsten en een lijst van betrouwbare verzenders, en kenmerken van bulkpost.
De derde laag is de leerlaag: een woordenstatistiek op je eigen post. Dit is het deel dat "zelflerend" waarmaakt, en het enige deel dat jouw uitzonderingen kan leren. Post van een buitenlandse overheidsinstantie is hier spam en voor de rest van de wereld niet. Geen enkel kant-en-klaar filter zal dat ooit zeggen.
De vierde laag is de AI, en alleen als scheidsrechter in de twijfelzone. Zijn gewicht is begrensd en hij kan een bericht nooit in zijn eentje in de spammap krijgen. De mail gaat als inhoud naar het model en nooit als opdracht. Ligt de verbinding eruit, dan valt de laag gewoon weg en beslissen de andere drie.
Drie uitkomsten in plaats van twee
Hier zit de kern. De meeste filters kennen twee uitkomsten: door of weg. Dit filter kent er drie.
Onder de lage drempel gebeurt er niets. Boven de hoge drempel gaat de mail naar de spammap. En daartussen zit een twijfelband waarin de mail gewoon in de wachtrij blijft staan, met een grijs vlaggetje "mogelijk spam" en de reden erbij.
Die middelste uitkomst is het hele punt. Een filter dat moet kiezen tussen weggooien en niets doen, gooit te vaak weg. Een filter dat mag twijfelen, kan voorzichtig zijn zonder nutteloos te worden.
Eerst alleen meekijken
Het filter mocht de periode niets verplaatsen. Alleen beoordelen, vastleggen en zichtbaar maken wat het zou hebben gedaan.
Zo rollen volwassen filters uit, en er zit een tweede winst in: je vindt je eigen drempels. Wat bij de ene organisatie een duidelijke spamscore is, is bij de andere de normale score van een leverancier die zijn post via een bulkdienst verstuurt.
De kop bewaren, ook wat je nu niet gebruikt
Eén technische keuze die later goud waard is: de hele kop wordt bewaard, niet alleen de velden die vandaag gebruikt worden.
E-mail is tijdelijk. Wil je over een half jaar een extra signaal toevoegen, dan kun je dat alleen nog nacontroleren op post die je nog hebt. Met de hele kop in huis reken je een nieuw signaal na op je eigen historie, zonder ook maar iets opnieuw op te halen.
De val die we onderweg vonden
Een afzender mag zelf een regel met authenticatie-uitslagen in zijn mail zetten. Dat maakt zo'n regel op zichzelf waardeloos: iedereen kan opschrijven dat zijn eigen post door de controle komt.
Daarom telt alleen de bovenste regel, want die zet je eigen mailserver erboven, en wordt de naam van de server apart bewaard. Staat daar niet je eigen mailserver, dan zegt de uitslag niets en wordt er niets met de uitslag gedaan. Hetzelfde geldt voor de route die een bericht heeft afgelegd: alleen de bovenste regels worden bekeken, en interne adressen tellen niet mee.
Wat het oplevert
Een schonere inbox, maar dat is niet de hoofdprijs.
De hoofdprijs is dat je bij elk oordeel de reden ziet. Een bericht met een vlaggetje en de tekst "afzender komt niet door de controle van het afzenderdomein" is iets waar een medewerker een besluit over kan nemen. Een bericht dat ongemerkt verdwijnt, is dat niet.
En een menselijke markering wint altijd, blijvend. Zet iemand er Geen spam op, dan blijft dat zo, en het filter leert ervan.
Lees ook
Weet je zeker dat je nu geen klantmail mist? Plan een
. Een controle op welke map je systeem eigenlijk leest, is een kwestie van minuten.
Bert