Van OpenClaw naar n8n: een zelfgebouwde mail-agent
Toen OpenClaw, een commerciële tool die AI-agents laat draaien op je eigen machine, uitkwam, heb ik drie instanties geïnstalleerd op de Mac Mini, elk met een eigen doel: één voor persoonlijk gebruik, één voor business en één voor demo's. Het concept was geweldig. De praktijk wat minder.
De kosten liepen op, de stabiliteit liet te wensen over, en ik merkte dat ik eigenlijk zelf beter wist wat ik nodig had. Dus besloot ik het heft in eigen handen te nemen en alles zelf te bouwen. Dit artikel gaat over die eerste stap: een mail-agent in n8n.
Wat moest de agent kunnen?
De vereisten waren eenvoudig maar concreet. De agent moet een specifieke mailbox in de gaten houden, elke nieuwe mail lezen en de inhoud intelligent verwerken naar een gestructureerde database. Voorlopig zijn er twee types:
- Agenda-items: afspraken, uitnodigingen, herinneringen met een datum en tijdstip
- Bestellingen: orderbevestigingen, verzendmeldingen, leveringsberichten van webshops en pakjesdiensten
Het bijzondere aan bestellingen is dat één bestelling meerdere mails genereert: een bevestiging van de webshop, een verzendbericht van de pakjesdienst, een melding dat de bezorger onderweg is, en een bevestiging van levering. Al die mails moeten slim worden samengevoegd tot één record in de database, ook als de webshop en de pakjesdienst verschillende referentienummers gebruiken.
Voor de agenda-e-mails was het eerder omgekeerd: voor de sport-activiteiten van de kinderen krijgen we soms e-mails met een planning voor de komende 3 maand. Eén e-mail genereert dus meerdere agenda-items.
Waarom n8n?
n8n is een open-source automatiseringstool die je volledig zelf kan hosten. Je bouwt workflows visueel, door nodes aan elkaar te koppelen. Er zijn nodes voor IMAP, databases, AI-modellen, code en nog veel meer. Het is gratis, draait lokaal op mijn Mac Mini, en geeft me volledige controle over wat er met mijn data gebeurt.
n8n (spreek uit: "natan") is een workflow-automatiseringstool vergelijkbaar met Zapier of Make, maar dan volledig zelfgehost en open source. Je verbindt bouwstenen visueel met elkaar: een trigger, een reeks acties, en een eindpunt. Ideaal voor het bouwen van kleine agents zonder zware ontwikkelomgeving.
De installatie
n8n installeren op een Mac Mini M4 vergde wat voorbereiding. Node.js moest op de juiste versie staan, waarvoor ik nvm (Node Version Manager) heb gebruikt. Na wat gepruts met rechtenproblemen in Homebrew ben ik via een directe installatie van nvm terechtgekomen, wat vlotter verliep. n8n zelf werd via npm geïnstalleerd en draait sindsdien als een launchd-service op de achtergrond, zodat hij automatisch opstart bij elke herstart van de Mac.
De workflow stap voor stap
De voorbereiding
Alvorens de n8n-workflow op te bouwen, had ik de nodige bronnen nodig om te gebruiken in het project:
- een database om bestellingen en agenda-items te bewaren
- een mailbox specifiek om nieuwe dingen door te geven aan de flow
- een flow naar deze mailbox
De database is vrij simpel: 3 tabellen:
De tabel agenda:
CREATE TABLE agenda ( id INT(11) NOT NULL AUTO_INCREMENT, titel VARCHAR(255) NOT NULL, beschrijving TEXT NULL DEFAULT NULL, locatie VARCHAR(255) NULL DEFAULT NULL, start_datum DATE NOT NULL, eind_datum DATE NULL DEFAULT NULL, start_tijd TIME NULL DEFAULT NULL, eind_tijd TIME NULL DEFAULT NULL, wie VARCHAR(255) NULL DEFAULT NULL, categorie VARCHAR(100) NULL DEFAULT NULL, kosten DECIMAL(8,2) NULL DEFAULT NULL, rekeningnummer VARCHAR(50) NULL DEFAULT NULL, extra_info TEXT NULL DEFAULT NULL, mail_uid INT(11) NULL DEFAULT NULL, aangemaakt TIMESTAMP NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id) );
De tabel bestellingen:
CREATE TABLE bestellingen ( id INT(11) NOT NULL AUTO_INCREMENT, artikel VARCHAR(255) NOT NULL, webshop VARCHAR(100) NULL DEFAULT NULL, pakjesdienst VARCHAR(100) NULL DEFAULT NULL, tracking_code VARCHAR(100) NULL DEFAULT NULL, order_reference VARCHAR(100) NULL DEFAULT NULL, besteld_op DATE NULL DEFAULT NULL, betaald TINYINT(1) NULL DEFAULT '0', aangekomen_leverancier TINYINT(1) NULL DEFAULT '0', verzonden TINYINT(1) NULL DEFAULT '0', geplande_levering DATE NULL DEFAULT NULL, geleverd_op DATE NULL DEFAULT NULL, opmerkingen TEXT NULL DEFAULT NULL, created_at TIMESTAMP NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id) );
De tabel other_mail:
CREATE TABLE other_mail ( id INT(11) NOT NULL AUTO_INCREMENT, mail_uid INT(11) NULL DEFAULT NULL, van VARCHAR(255) NULL DEFAULT NULL, onderwerp VARCHAR(500) NULL DEFAULT NULL, samenvatting TEXT NULL DEFAULT NULL, ontvangen_op DATETIME NULL DEFAULT NULL, aangemaakt TIMESTAMP NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id) USING BTREE, INDEX mail_uid (mail_uid) );
De mailbox beheer ik bewust lokaal op de Synology NAS. Een dedicated mailbox waar enkel e-mails terechtkomen voor dit project.
De flow naar deze mailbox, dus het vullen met e-mails, gebeurt simpelweg via regels in andere mailboxen:
- Vanuit mijn bedrijfsmailbox (M365)
- Vanuit mijn persoonlijke mailbox (Gmail)
In Gmail ziet dat er bijvoorbeeld als volgt uit:
De n8n workflow
De workflow bestaat uit een reeks nodes die elkaar opvolgen. Ik beschrijf de logica, niet de technische details.
Een Schedule Trigger start de workflow om de tien minuten. Een IMAP-node haalt alle ongelezen mails op uit de mailbox op mijn Synology NAS en markeert ze meteen als gelezen. Een eerste AI-node analyseert elke mail en geeft een gestructureerd JSON-object terug: type, onderwerp, afzender, datum en de relevante velden afhankelijk van het type. Een Switch-node stuurt agenda-items naar één tak en bestellingen naar een andere.
Voor bestellingen volgt daarna een slimmere stap: de workflow haalt alle openstaande bestellingen op uit de database en legt die voor aan een tweede AI-node. Die beslist op basis van de mailinhoud en de openstaande orders of het om een nieuwe bestelling gaat of om een update van een bestaande. Tot slot schrijft een MySQL-node het resultaat weg naar de MariaDB-database op de Synology.
Ja, er was ook wat JavaScript-code nodig. n8n heeft een Code-node waarmee je kleine stukjes logica kan schrijven, bijvoorbeeld om de JSON-output van het AI-model te parsen of om dynamische SQL-queries samen te stellen voor updates.
De firewall: een verrassende uitdaging
Omdat de Mac Mini in een geïsoleerd AI Lab VLAN zit, had hij standaard geen toegang tot de Synology op het hoofdnetwerk. Dat is uiteraard de bedoeling van de VLAN-segmentatie, maar voor deze workflow moesten we uitzonderingen toevoegen in pfSense: poort 993 voor IMAP en poort 3306 voor MariaDB, beide alleen van het Mac Mini IP-adres naar de Synology. Precies genoeg, niet meer.
De zoektocht naar het juiste AI-model
Dit is eerlijk gezegd nog steeds een werk in uitvoering. Ik heb tijdens dit project meerdere modellen uitgeprobeerd.
Ik begon met Ollama lokaal op de Mac Mini, met het Gemma 4-model van Google in de cloudvariant van 31 miljard parameters. De kwaliteit was goed, de redenering zichtbaar en de kostprijs nul. Het nadeel is dat lokale modellen trager zijn en dat de beschikbaarheid van de cloudvariant niet gegarandeerd is zonder API-sleutel.
Uiteindelijk ben ik overgestapt naar de OpenAI API met GPT-4o. Snel, betrouwbaar en verrassend goedkoop voor dit gebruik: een typische mailclassificatie kost minder dan een eurocent. Maar de afweging tussen lokaal draaien voor privacy en betalen voor een externe API blijft een persoonlijke keuze die iedereen zelf moet maken.
Lokale modellen via Ollama zijn gratis en privacy-vriendelijk, maar vereisen voldoende hardware en zijn trager. Cloud-API's zoals OpenAI of Anthropic zijn sneller en krachtiger, maar kosten geld en sturen je data naar externe servers. Voor gevoelige mailinhoud is dat een afweging die je bewust moet maken.
Beschikbaar voor de hele familie
De agendapunten en bestellingsinformatie beschikbaar hebben in een database is natuurlijk nog maar het begin: ik wil deze gegevens zichtbaar zien voor het hele gezin.
Daarom bouwde ik een beveiligde website, waar enkel mijn vrouw, ik en mijn kinderen toegang toe hebben, en creëerde ik een interface voor de agenda:
En een interface voor de bestellingen:
Gebouwd samen met Claude
Ik heb deze workflow en website niet alleen gebouwd. Claude van Anthropic was mijn sparringpartner doorheen het hele traject: van de initiële architectuurkeuze over de installatieproblemen met Node.js en pfSense tot het schrijven van de prompts en de JavaScript-code in de workflow. Dat is trouwens ook de manier waarop ik dit soort projecten aanpak: niet googelen tot je er bij neervalt, maar een AI als co-piloot gebruiken die de context van je project kent en meedenkt.
Uiteraard moet je zelf blijven nadenken. Een AI maakt fouten, stelt soms te snelle oplossingen voor en kent jouw specifieke omgeving niet altijd even goed. Maar als klankbord en als schrijver van boilerplate-code is het onmisbaar geworden.
Wat staat er nog op de planning?
De workflow voor agenda-items is nog niet volledig uitgewerkt. Daarnaast zou ik de agenda-punten graag in de familie-agenda krijgen en niet simpel op een website.
En op langere termijn wil ik natuurlijk ook andere e-mailtypes gaan verwerken: klantvragen, change requests ... Ook het automatisch toekennen van prioriteit en belang staat nog op de planning :-).
Conclusie
Zelf bouwen is meer werk dan een kant-en-klare tool gebruiken. Maar je leert meer, je betaalt minder, en je weet precies wat er met je data gebeurt. n8n is daarvoor een uitstekend vertrekpunt: laagdrempelig genoeg om snel resultaat te boeken, maar krachtig genoeg om complexe logica in te bouwen. De zoektocht naar het ideale AI-model voor dit soort taken is nog niet voorbij, maar dat maakt het des te interessanter.