Auto-replies herken je betrouwbaar via specifieke headers: Auto-Submitted, X-Autoreply, X-Autorespond en X-Auto-Response-Suppress geven het meeste houvast. Subject- en afzenderchecks dienen alleen als vangnet wanneer die headers ontbreken. Vind je een van die markers, dan onderdruk je vervolgacties direct of pauzeer je de opvolgflow, zodat je salesteam geen tijd verspilt aan een boodschap die niemand heeft getypt.

Welke headers verklappen een auto-reply?

De meeste ontwikkelaars zoeken eerst in het onderwerp, maar dat is de omgekeerde volgorde.

De header Auto-Submitted, vastgelegd in RFC 3834, is de belangrijkste marker. Elke waarde anders dan “no” wijst op een automatisch gegenereerd bericht: “auto-replied”, “auto-generated” en “auto-notified” komen allemaal voor. Check dus niet alleen op aanwezigheid van de header, maar ook op de exacte waarde.

Daarnaast bestaan er vendor-specifieke headers die je nooit mag negeren:

  • X-Autoreply en X-Autorespond: gebruikt door diverse mailclients en webmaildiensten om een auto-antwoord te markeren.
  • X-Auto-Response-Suppress: de header van Microsoft Exchange en Outlook, met waarden als “All” of “AutoReply” die andere systemen vertellen géén automatisch antwoord terug te sturen, zoals de Exchange-documentatie beschrijft.
  • List-Id en List-Unsubscribe: signalen dat een bericht van een mailinglijst of nieuwsbrief komt, niet van een individuele afzender.
  • Precedence met waarde “bulk” of “list”: ouder, maar volgens RFC 2919 nog altijd in gebruik bij bulkverkeer.

Pro-tip: Headerchecks geven bijna geen valse positieven. Nylas noemt subject-only checks aanzienlijk ruisgevoeliger, dus behandel headers als je eerste en enige harde bewijs.

Wat als headers ontbreken? Afzender en onderwerp als vangnet

Niet elke mailserver stuurt vendor-headers mee. Oudere systemen, sommige interne mailrelays en een deel van de gratis webmaildiensten laten die informatie gewoon weg. Dan val je terug op tekstuele signalen, met alle onzekerheid die daarbij hoort.

Praktische heuristieken die werken:

  • Regex op het afzenderadres voor patronen als no.?reply@, mailer-daemon@ en postmaster@.
  • Subject-matching op vaste uitdrukkingen zoals “out of office”, “automatic reply” en Nederlandse varianten als “automatisch antwoord” of “afwezigheidsmelding”.
  • Controleren of een bericht alleen een HTML-deel heeft zonder platte tekst, vaak een teken van een gegenereerde sjabloonmail.

Het risico op valse positieven is hier reëel: een collega die toevallig “ben zo terug” in het onderwerp typt, mag niet als bot worden weggezet. Gebruik deze checks daarom uitsluitend als aanvulling, nooit als eerste filter.

Hoe bouw je een detectiefunctie? Voorbeeldcode

Een compacte functie die headers en subject combineert, past in vrijwel elke inbound handler. Het patroon volgt de aanpak die ontwikkelaarsgidsen van Nylas en het bot-framework van Cerb allebei gebruiken: eerst headers doorlopen, dan pas de onderwerpregel checken.

function isAutoReply(message) {
  const vendorHeaders = [
    'auto-submitted',
    'x-autoreply',
    'x-autorespond',
    'x-auto-response-suppress'
  ];

  for (const header of message.headers) {
    const name = header.name.toLowerCase();
    const value = (header.value || '').toLowerCase();

    if (name === 'auto-submitted' && value !== 'no') return true;
    if (vendorHeaders.includes(name) && value.length > 0) return true;
  }

  const subject = (message.subject || '').toLowerCase();
  const subjectHints = ['out of office', 'automatic reply', 'automatisch antwoord'];
  return subjectHints.some(hint => subject.includes(hint));
}

Drie punten verdienen aandacht:

  1. Itereer altijd over het headers-array, niet over een lookup-map op naam. Sommige providers sturen dezelfde header meerdere keren, en een map overschrijft dan stilletjes een treffer.
  2. Match case-insensitief. Headernamen en waarden variëren per server; “Auto-Submitted” en “auto-submitted” moeten identiek worden behandeld.
  3. Reken op minder dan 1 millisecondeper bericht. Deze check is licht genoeg om synchroon te draaien in een message.created-webhook, vóór je enige zwaardere logica aanroept.

Waar in je flow hoort deze check?

Draai de detectie altijd vóór je iets anders met het bericht doet, dus op het moment dat een message.created-event of vergelijkbare trigger afgaat. Alles wat daarna gebeurt, hangt af van deze uitkomst.

  • Vraag bij het ophalen van berichten expliciet om volledige headers: include_headers levert een completere set dan include_basic_headers, vooral bij providers die anders alleen basisvelden teruggeven.
  • Houd rekening met verschillen tussen IMAP, EWS en moderne API’s: niet elke koppeling geeft dezelfde vendor-headers door, zeker bij oudere Exchange-servers.
  • Blokkeer bij een treffer: het opschuiven van een sequence, het activeren van een AI-agent en elk automatisch antwoord vanuit jouw systeem.

Hoe test je de detectie en welke randgevallen mis je vaak?

Een detectiefunctie die je nooit test, gaat vroeg of laat de mist in bij net dat ene mailsysteem dat zich anders gedraagt dan verwacht.

Bouw minimaal deze testcases:

  1. Bericht met correcte Auto-Submitted header en waarde “auto-replied”.
  2. Bericht zonder enige header, maar met “out of office” in het onderwerp.
  3. Bericht van een mailinglijst met List-Id en Precedence: bulk.
  4. Bericht vanaf een mailer-daemon-adres zonder herkenbare subject.

Combineer dit met looppreventie: houd per thread of per afzender een cooldown aan, sta maximaal één automatische reactie per thread toe en zet een frequency cap op herhaalde triggers van dezelfde afzender. Let bovendien op dubbele headers, wisselende hoofdletters en oudere IMAP-servers die vendor-headers gewoonweg niet meesturen.

Pro-tip: Bewaar een simpele “already-replied”-registratie per thread-ID, ook al is het maar een tabel in je database. Dat voorkomt dat je systeem tweemaal op dezelfde auto-reply reageert, iets wat vaker misgaat dan ontwikkelaars verwachten.

Waarom auto-reply detectie de leadkwaliteit beschermt

Een auto-reply lijkt op engagement, maar is het niet. Als je systeem elke ontvangen mail als reactie telt, vervuilen die automatische antwoorden je signalen voor koopintentie en verstoor je precies de data waarop je opvolging draait.

Elke gedetecteerde auto-reply wordt behandeld als een “no intent”-moment: de opvolgflow pauzeert, de gebeurtenis wordt gelogd, en het salesteam ziet geen vervuilde melding in de pijplijn. Zo blijft elk signaal dat wél doorkomt, betrouwbaar genoeg om op te reageren.

Dat onderscheid tussen echte interesse en een systeemreactie is precies waar goede e-mail automation op staat of valt.

Wat de meeste ontwikkelaars over het hoofd zien

De technische kant van auto-reply detectie is niet het moeilijke deel. Een header uitlezen is triviaal; het lastige zit in de discipline om headers als bron van waarheid te behandelen in plaats van subject-tekst.

Veel implementaties die ik langskomen, draaien de volgorde om: ze bouwen eerst een lijst met subject-patronen en voegen headerchecks later toe als “extra zekerheid”. Dat is de verkeerde prioriteit. Onderzoek van Nylas laat zien dat headerchecks vrijwel geen valse positieven opleveren, terwijl subject-only detectie voortdurend ruis genereert. Wie subject-matching als eerste filter gebruikt, mist niet alleen edge cases, maar bouwt een systeem dat structureel te veel echte reacties als bot wegfiltert of, erger, te veel bots als mens behandelt.

Wat de meeste ontwikkelaars over het hoofd zien — overview diagram

Het tweede punt dat onderbelicht blijft: waar de check draait, is net zo belangrijk als wat hij checkt. Een detectiefunctie die pas na drie downstream-stappen wordt aangeroepen, heeft zijn werk al te laat gedaan. Zet hem vooraan in je message.created-webhook, voordat er sequences opschuiven of agents worden getriggerd. Dat is geen esthetische keuze, het is de enige plek waar de check daadwerkelijk voorkomt dat verspilde acties plaatsvinden.

Voor teams die op schaal koude acquisitie draaien, is dit geen randdetail maar infrastructuur. Foutieve signalen in je outreach-strategie kosten meer dan een verkeerde melding: ze kosten vertrouwen in de data waarop elke volgende beslissing rust.

— Donny

Bronnen

Aanbevelingen