← Blog

Email automation

E-mailagent op Microsoft Graph: weg met het Outlook-doolhof

Een Antwerps advocatenkantoor met 38 mensen vroeg ons 312 Outlook-regels op te ruimen zonder hun iManage DMS aan te raken. Dit is de Microsoft Graph-agent die we opleverden.

Jacob Molkenboer· Oprichter · A Brand New Company· 7 jun 2026· 10 min
Manilla envelop met groen lakzegel naast een koperen postrek met drie crèmekleurige kaartjes en een rode stempel.

Het is dinsdagochtend in februari. Marleen, praktijkmanager van een advocatenkantoor met 38 mensen in Antwerpen, klapt haar laptop open. Haar inbox telt 1.118 ongelezen berichten. Ze loopt niet achter. Ze zit eronder bedolven.

Het kantoor draait op Outlook, Exchange Online en iManage Work. In tien jaar hebben de partners en paralegals samen 312 client-side Outlook-regels opgetuigd. Sommige markeren asbestverwijzingen als urgent. Andere verplaatsen deurwaardersbevestigingen naar een map die niemand leest. Eén regel, geschreven door een senior partner die intussen vertrokken is, gooit alles van een specifieke tegenpartij stilletjes in de prullenbak.

Niets daarvan is gedocumenteerd. De helft werkt niet meer. Nieuwe medewerkers krijgen hun eigen inbox niet getrieerd zonder een paralegal te vragen in welke submap een dwangbevel voor incasso thuishoort.

Dit is de mail die de praktijkmanager ons stuurde. "We willen geen nieuw DMS. We willen geen nieuwe e-mailclient. We willen dat die regels niet langer onze bottleneck zijn."

De scope: alleen e-mail, DMS onaangeraakt

Voordat we ook maar één regel code schreven, trokken we een grens. iManage Work blijft. De mappenstructuur in iManage blijft. De dossiernummering blijft. We schrijven niet naar het DMS. We lezen niet uit het DMS. De agent leeft een laag erboven, in de inbox, en geeft netjes af zodra een mens een bericht oppakt.

Die afbakening is de hele reden dat het project in zes weken liep en niet in zes maanden. Elke legal-tech-RFP die we voorbij hebben zien komen probeert het DMS, de tijdregistratie, de facturatie en de conflictcheck in één hap te verslinden. Het kantoor heeft prima tools. Het heeft een slechte e-maillaag.

Takeaway

Een e-mailagent van 90 dagen die het bestaande DMS respecteert, presteert beter dan een "AI-legal-platform" van 12 maanden dat probeert hem te vervangen.

Microsoft Graph als basis

Het kantoor draait op Microsoft 365. Dat betekent dat Microsoft Graph de juiste basis is. Geen IMAP. Geen SMTP-relay. Geen desktop-Outlook-add-in. Graph geeft ons drie dingen die we nodig hebben: abonneren op inboxwijzigingen via webhooks, berichten lezen en aanpassen zonder de client van de gebruiker aan te raken, en concept-antwoorden aanmaken die in de map Concepten van de gebruiker landen voor menselijke review.

We registreerden een single-tenant Entra-applicatie met één gedelegeerde scope (Mail.ReadWrite) en één application scope (ook Mail.ReadWrite, ingeperkt tot de 38 pilotmailboxen met een Application Access Policy). Dat applicatiebeleid is het deel dat de meeste teams overslaan. Zonder die policy kan een Graph-token dat aan jouw app wordt uitgegeven elke mailbox in de tenant lezen. De CISO trekt het project dan, terecht, ter plekke de nek om.

# Restrict the app's Mail.ReadWrite scope to one mail-enabled group
New-ApplicationAccessPolicy `
  -AppId 4f1b3c... `
  -PolicyScopeGroupId email-agent-pilot@firm.be `
  -AccessRight RestrictAccess `
  -Description "ABN email agent, pilot mailboxes only"

Abonneren op inboxwijzigingen

Graph change notifications zijn hoe de agent leert dat er een nieuw bericht binnen is. We POSTen een subscription per mailbox, verlengen ruim voor de vervaltijd, en valideren elke binnenkomende notificatie tegen een client state secret. De huidige maximale levensduur voor mail-resource-subscriptions is 4230 minuten, gedocumenteerd in de Graph subscription reference. We houden zes uur marge en verlengen via een cron.

POST https://graph.microsoft.com/v1.0/subscriptions
Content-Type: application/json

{
  "changeType": "created",
  "notificationUrl": "https://agent.firm.be/graph/notifications",
  "resource": "users/{userId}/mailFolders('Inbox')/messages",
  "expirationDateTime": "2026-06-10T08:00:00Z",
  "clientState": "redacted-256-bit-secret",
  "includeResourceData": false
}

We vragen bewust geen resource data op in de notificatiepayload. Die feature vereist asymmetrische encryptie en levert ons hier niets op. Komt er een notificatie binnen, dan halen we de berichttekst op met een verse Graph-call. Twee round trips, beide binnen dezelfde tenant, beide snel.

De classifier voor 14 dossiertypes

Het kantoor doet 14 dossiertypes: letselschade, arbeidsrecht, familierecht, vreemdelingenrecht, commerciële contracten, vastgoed, faillissementen, intellectueel eigendom, strafrecht, fiscaal recht, AVG-klachten, asbest en industrieziekten, medische fouten, en incasso. Elk type heeft een eigen intakelijst, eigen urgentieregels, en een eigen pool paralegals.

De classifier is één model-call per bericht. We gebruiken een klein reasoning-model voor classificatie (het kostenverschil telt als je 400 berichten per dag verwerkt) en een groter model voor de concept-antwoordstap. De classificatieprompt bestaat uit drie stukken: het onderwerp en de eerste 800 tekens van de berichttekst, de bekende rol van de afzender als we die hebben (cliënt, tegenpartij, griffier, intern), en de 14 dossierdefinities uitgeschreven als één alinea per stuk.

De output is een strikt JSON-object. We valideren het voordat er routing-logica draait.

{
  "matter_type": "asbestos",
  "confidence": 0.91,
  "urgency": "high",
  "sender_role": "client",
  "action_hint": "intake_questionnaire",
  "matter_id_guess": "MAT-2024-0837",
  "reasoning_brief": "Self-described former shipyard worker, 1978 to 1991, requests case review, references prior phone call last week."
}

Zakt het vertrouwen onder 0,75, dan doet de agent niets zichtbaars. Het bericht blijft staan in de inbox, niet verplaatst, geen concept, en de partner trieert het op de oude manier. Geen categorie. Geen concept. Geen stille gok. Dit was het meest gevraagde gedrag vanuit de partners.

Waarschuwing

Laat een classifier nooit stilletjes juridische post met laag vertrouwen routeren. Een verkeerd ingedeeld bericht over een verjaringstermijn is een aansprakelijkheidsclaim. Faal open naar de mens.

Routeren zonder map-chaos

Het oude regel-doolhof verplaatste berichten naar mappen. Wij niet. Mapverplaatsingen breken de conversatieweergave van Outlook, verstoppen berichten voor de zoekfunctie, en geven partners het gevoel dat ze de controle over hun eigen inbox kwijt zijn. Wij gebruiken in plaats daarvan Outlook-categorieën.

Elk dossiertype krijgt een gekleurde categorie. Urgentie voegt een tweede categorie toe ("Urgent" rood, "Routine" grijs). De inbox van de partner is gegroepeerd op categorie. De berichten blijven in de inbox staan. De classificatie is met een rechtermuisklik terug te draaien.

We hebben overwogen één categorie te gebruiken en die vol te proppen met gestructureerde tekst, zoals sommige Outlook-poweruseres doen. Dat hebben we verworpen. De gekleurde balk in de categoriekolom van Outlook is het goedkoopste stukje UI waar het kantoor voor betaalt. Een partner die zijn inbox scant ziet rood voor urgent en de dossierkleur in één oogopslag. Een string verstopt binnenin een categorie vraagt om een parse. De zichtbare classificatie is het deel dat het vertrouwen van de partner koopt.

PATCH https://graph.microsoft.com/v1.0/users/{userId}/messages/{messageId}
Content-Type: application/json

{
  "categories": ["Matter: Asbestos", "Urgency: High"]
}

We stempelen ook een single-property extension op het bericht met de output van de classifier, de modelversie en de prompt-hash. Meldt een partner een verkeerde classificatie, dan kunnen we twee maanden later de exacte beslissing nog naspelen. Voor een legal-tech-deployment is dat niet optioneel. De audit trail is het product.

Concept-antwoorden die de partner afmaakt

Voor 9 van de 14 dossiertypes schrijft de agent een concept-antwoord. Niet voor alle. Strafrecht, asbest en medische fouten zijn uitgesloten. Het eerste contact in die dossiers is te zwaarwegend en te feitelijk specifiek om te templateren, en de partners zeiden ons dat op dag één. De twee resterende afhakers, fiscaal recht en AVG-klachten, vielen na een pilotweek af toen duidelijk werd dat de huisformulering van het kantoor daar echte juridische lading draagt.

Voor de overgebleven 9 wordt het concept opgebouwd uit een dossier-specifieke prompt plus de huisstijl van het kantoor. Het concept landt in de map Concepten van de ontvangende partner via Graph's createReply-endpoint, met een categorie "ABN concept, gelieve te reviewen".

POST https://graph.microsoft.com/v1.0/users/{userId}/messages/{messageId}/createReply

Een vervolg-PATCH schrijft de inhoud. We zetten nooit isDeliveryReceiptRequested. We roepen nooit send aan. De partner bewerkt het concept binnen Outlook zoals altijd, en drukt zelf op verzenden. De bijdrage van de agent is de eerste 80% van het typewerk.

In de eerste drie weken van de pilot verstuurden partners 71% van de concepten binnen 12 minuten na opening, bewerkten 24%, en gooiden 5% weg. We loggen elke weggegooide variant met het ruwe bericht en het verworpen concept, en gebruiken die om elke vrijdag de prompts per dossiertype bij te schaven.

De nuttigste promptwijziging in week drie ging over incasso. De oorspronkelijke prompt ging ervan uit dat elk binnenkomend incassobericht namens een schuldeiser was. In de Belgische praktijk vertegenwoordigt dit kantoor net zo vaak schuldenaars als schuldeisers, en de agent opende met schuldeisersvriendelijke taal. De fix was een afzender-signaal: als het afzenderdomein van een bekend incassobureau is, schrijft de agent het concept als advocaat van de schuldenaar. Anders neutraal, met het verzoek aan de partner om de zijde te markeren. Die ene wijziging trok het wegooi-percentage op incasso-concepten in één week omlaag van 14% naar 3%.

De DMS-handshake die we niet bouwden

Halverwege de pilot vroegen de partners of de agent het bericht ook in de juiste iManage-workspace kon archiveren. We zeiden nee. En dat meenden we.

iManage Work heeft al een degelijke archiverings-UX binnen Outlook. Het risico dat een agent een bericht onder het verkeerde dossiernummer archiveert is niet hypothetisch. Dat is een belangenconflict-melding die staat te wachten. Wat de agent in plaats daarvan doet, is een dossiernummer suggereren in de categoriebalk ("Dossier-ID gok: MAT-2024-0837"). De partner klikt op de iManage-archiveerknop in Outlook met die suggestie al op het klembord. iManage blijft de bron van waarheid.

Dat was niet de technisch interessante keuze. Het was de juiste.

Uitrol per partner

We hebben de agent niet in één keer voor 38 mailboxen aangezet. We begonnen met drie: de praktijkmanager en twee senior associates die zich hadden aangemeld. Die draaiden twee weken terwijl wij de prompts per dossiertype bijschaafden en elke ochtend in het weggooi-log keken. De volgende golf voegde de letselschade-partners toe (vier mailboxen). De golf daarna de commerciële en vastgoedteams (elf mailboxen). De strafrecht-partners kwamen als laatste, en kozen toen nog alleen voor classificatie-modus zonder concepten.

De uitrolvolgorde was niet technisch. Hij was politiek. De advocaten met de meest uitgebreide Outlook-regels waren de mensen die het verlies aan controle het sterkst zouden voelen. Hen vroeg toegang geven tot het dashboard, elke classificatiebeslissing laten zien en elk concept met één klik laten afwijzen, sloeg dat om in nieuwsgierigheid. Tegen week zes typten twee van de regelbouwers zelf in gewoon Nederlands prompt-aanpassingen uit en mailden die op vrijdagmiddag naar ons. Wij rolden die maandag mee in de release. Die feedback-loop deed meer voor de nauwkeurigheid dan welke modelwijziging dan ook.

Wat in week twee brak

Drie dingen braken die we niet hadden voorzien.

Eén: Graph webhook-bezorgingen komen niet gegarandeerd in volgorde aan. Een "message created"-notificatie kan na een "message moved"-notificatie voor hetzelfde bericht binnenkomen. Onze eerste versie classificeerde berichten die al door een partner vanaf mobiel waren beantwoord en in Verzonden Items stonden. We hebben dat opgelost door bij classificatietijd de parentFolderId van het bericht opnieuw op te halen en alles te skippen wat de inbox al verlaten had.

Twee: de Nederlandstalige en Franstalige correspondentie van het kantoor werd niet consistent geclassificeerd. De classifier was sterk in het Engels en zwak op Antwerps-dialectisch Vlaams. We voegden een voorstap toe die de taal detecteert en Vlaamse en Franse berichten door een taal-specifieke system prompt jaagt met vijf gelabelde voorbeelden per dossiertype. De ondergrens van het vertrouwen sprong in één middag op Vlaams van 0,61 naar 0,88.

Drie: Microsoft Graph throttlet Outlook-calls per app en per tenant. We liepen op een maandagochtend tegen een 429-burst aan toen 38 mailboxen een vertraagde batch zondagavond-gerechtsnotificaties tegelijk kregen en de agent voor allemaal parallel classificatie-calls afvuurde. We hebben een token-bucket-limiter en een retry-with-jitter op 429-responses ingebouwd, met de Retry-After-header als bron van waarheid wanneer Graph die meegeeft. De bucket is sindsdien niet meer leeggelopen.

Eerlijk gezegd: dit is doodgewoon werk. Het meeste engineering aan een e-mailagent zit niet in het model. Het zit in de handshakes, de verlengingen, de retries, en de talen.

Waar je morgen mee kunt beginnen

Draai jij een Microsoft 365-tenant en wil je weten of dit patroon op jouw kantoor past, draai dan één query. In PowerShell, tegen je tenant: Get-InboxRule -Mailbox <your-mailbox> | Measure-Object. Doe dat daarna voor de vier of vijf drukste mailboxen. Komt het totaal boven 200, dan heb je het probleem al. Het regel-doolhof is geen feature. Het is een schuld.

Toen we deze e-mailagent voor het Antwerpse kantoor bouwden, kwam de verleiding telkens terug om de agent zelf te laten versturen, archiveren en loops te laten sluiten. We hebben dat opgelost door de inbox van de partner als de enige plek te behandelen waar een menselijke beslissing leeft, en de agent als het snelst denkbare concept.

Kern

Een e-mailagent van 90 dagen die het bestaande DMS respecteert, presteert beter dan een AI-legal-platform van 12 maanden dat probeert hem te vervangen.

FAQ

Waarom Microsoft Graph en niet IMAP of een Outlook-add-in?

Graph geeft je een tenant-brede API die op change notifications draait, met scopes per mailbox. IMAP is per mailbox en rommelig. Add-ins draaien client-side en missen berichten die op mobiel of op een andere werkplek geopend zijn.

Verstuurt de agent antwoorden automatisch?

Nee. Elk antwoord landt in de map Concepten van de partner. De mens leest, bewerkt en drukt op verzenden. Voor vijf dossiertypes maken we helemaal geen concept omdat het eerste contact daar te veel juridische lading draagt.

Hoe houd je de agent uit mailboxen die zich niet hebben aangemeld?

Een Entra Application Access Policy beperkt de Mail.ReadWrite-scope van de app tot één mail-enabled group. Zonder die policy kan een Graph-applicatietoken elke mailbox in de tenant lezen.

Waarom categorieën in plaats van mapverplaatsingen?

Mapverplaatsingen breken de conversatieweergave van Outlook en verstoppen berichten voor de zoekfunctie. Categorieën laten de inbox staan die de partners al kennen, zijn met één rechtermuisklik terug te draaien, en groeperen netjes op dossier en urgentie.

email automationai agentsautomationintegrationsworkflowcase study

Iets bouwen?

Start een project