Deze week belde een klant op om te zeggen dat hij al drie weken geen leads meer had binnengekregen. Niet omdat zijn site offline was. Niet omdat het formulier een foutmelding gaf. Het formulier deed gewoon niks meer. Verstuurde berichten verdwenen in het niets, en niemand had het gemerkt.
Dit is een van de vervelendste problemen in websitebeheer, omdat het onzichtbaar is. De bezoeker denkt dat zijn bericht is verstuurd. De eigenaar wacht op contact dat nooit komt. En jij als beheerder krijgt de schuld van drie weken gemiste omzet.
Hieronder leg ik uit waarom dit zo vaak gebeurt en wat je eraan doet.
Hoe een WordPress-formulier eigenlijk mailt
Veel mensen denken dat een formulier gewoon een mailtje stuurt. Zo simpel is het niet. Wat er achter de schermen gebeurt:
- Bezoeker vult het formulier in en klikt op verzenden
- WordPress verwerkt de POST-aanvraag via PHP
- PHP roept de mail()-functie aan, of een SMTP-bibliotheek
- De server probeert het bericht af te leveren bij een mailserver
- Die mailserver beslist of het bericht aankomt of in een spamfilter verdwijnt
Stap vier en vijf zijn waar het misgaat. De meeste goedkope hostingpakketten sturen via de ingebouwde mail()-functie van de server. Dat werkt totdat de hostingprovider iets aanpast aan zijn spambeleid, totdat een ander account op dezelfde server op een blacklist terechtkomt, of totdat een beveiligingsupdate de mail()-functie stilletjes uitschakelt.
Je formulierplugin geeft dan geen foutmelding, want vanuit zijn perspectief heeft hij de aanvraag netjes doorgegeven. Wat er daarna gebeurt, is niet zijn probleem.
De meest voorkomende oorzaken
Er zijn een handvol redenen die ik keer op keer tegenkom:
Gedeelde hosting met een slechte reputatie. Als jouw server door andere gebruikers wordt misbruikt voor spam, komt het IP-adres van die server op een blacklist. Jouw formuliermail wordt dan geweigerd door ontvangende mailservers, ook al heb je zelf niks fout gedaan.
Een WordPress-update die iets heeft geraakt. Niet altijd de core-update zelf, maar soms een PHP-versie-upgrade die de hostingprovider meteen daarna uitvoert. PHP 8.x gedraagt zich anders dan PHP 7.x op een paar punten die formulierplugins raken.
Een pluginconflict. Een beveiligingsplugin die strikte regels hanteert voor uitgaand verkeer, of een cacheplugin die formulierverzoeken abusievelijk cachet.
SPF- en DKIM-records die niet kloppen. Als je domein geen correcte SPF-records heeft, zullen veel mailservers berichten van jouw server weigeren of direct in spam gooien. Dit was vroeger minder streng; tegenwoordig is het een harde eis.
De ontvanger heeft een agressief spamfilter. Soms komt de mail wel aan bij de mailserver, maar verdwijnt hij in een spammap die niemand leest. Technisch gezien werkt het formulier dan prima.
Hoe je het probleem opspoort
Eerst wil je weten waar het fout gaat. Doe dit stap voor stap.
Stuur een testmail via PHP. Maak een eenvoudig testbestandje aan op de server en roep de mail()-functie direct aan. Als dat niet werkt, is het probleem op serverniveau en heeft het niets met WordPress te maken.
Verwijder dit bestand meteen na de test. Laat het nooit op een productieserver staan.
Controleer de logbestanden. In cPanel of Plesk vind je maillogboeken. Zoek naar foutmeldingen rondom het tijdstip van een mislukte verzending. Termen als relay denied, connection refused of 550 SPF vertellen je precies wat er misgaat.
Controleer de SPF-records van je domein. Gebruik een DNS-lookup tool om te zien of jouw domein een SPF-record heeft en of het serveradres erin staat. Ontbreekt het record, dan is dat waarschijnlijk de oorzaak.
Controleer de spammap van de ontvanger. Simpel, maar het wordt altijd vergeten. Vraag de klant om zijn spammap te doorzoeken op berichten van het formulier.
Installeer tijdelijk een SMTP-logger. Sommige formulierplugins hebben een ingebouwde logfunctie. Schakel die in en verstuur een testbericht. Kijk wat de plugin rapporteert.
De oplossing: SMTP in plaats van de server-mail
De structurele oplossing voor bijna alle formulierproblemen is het instellen van SMTP. In plaats van dat WordPress via de server mailt, verbind je het met een echte mailaccount die via een geauthenticeerde verbinding verstuurt.
Dat werkt zo:
- Je installeert een SMTP-plugin in WordPress
- Je vult de gegevens in van een bestaand e-mailaccount, bijvoorbeeld het info-adres van de klant
- WordPress stuurt voortaan alle mail via die account, inclusief formulierberichten
Het voordeel is dat de mail nu verstuurd wordt vanuit een geverifieerde account, met de juiste authenticatie. Ontvangende mailservers vertrouwen dat veel meer dan een anonieme servermail.
Let op een paar dingen bij het instellen:
- Gebruik bij voorkeur een apart e-mailadres voor formuliermail, niet het hoofdadres van de eigenaar
- Stel het “Van”-adres in op iets wat bij het domein hoort, niet op een willekeurig Gmail-adres
- Zorg dat het wachtwoord van het SMTP-account sterk is en niet hetzelfde als andere accounts
- Noteer de inloggegevens ergens veilig buiten WordPress, want als je ooit de site migreert heb je ze nodig
Na het instellen stuur je altijd een testmail via de plugin zelf. Controleer ook of het formulier nog steeds werkt na het opslaan van de instellingen. Soms overschrijft een formulierplugin de SMTP-instellingen met zijn eigen configuratie.
Monitoring: hoe je dit nooit meer mist
Het echte probleem bij die klant van me was niet dat het formulier kapot was. Het echte probleem was dat niemand het drie weken had gemerkt.
De oplossing daarvoor is simpel: stuur jezelf elke week een testbericht via het contactformulier. Dat klinkt omslachtig, maar je kunt het automatiseren. Sommige monitoringtools sturen periodiek een formulierverzoek en controleren of er een bevestigingsmail terugkomt.
Als je dat niet wilt automatiseren, doe het dan handmatig als onderdeel van je maandelijkse onderhoudsronde. Vul het formulier in met een duidelijk testonderwerp, wacht op de bevestigingsmail en controleer of de ontvanger het bericht ook heeft gekregen.
Zet ook een apart e-mailadres in als ontvanger van formulierberichten, een adres dat je zelf beheert. Dan merk je het meteen als er iets misgaat, in plaats van te moeten vertrouwen op de klant die het doorgeeft.
Andere dingen die helpen:
- Schakel de logfunctie van de formulierplugin in als die beschikbaar is
- Bewaar verzonden berichten minimaal dertig dagen in de log
- Stel een notificatie in als het formulier een bepaald aantal dagen geen berichten heeft ontvangen, de meeste formulierplugins ondersteunen dit
Een formulier dat niks ontvangt, hoeft niet kapot te zijn. Maar als het normaal elke dag twee berichten krijgt en plotseling niks meer, is dat een signaal.
Wat je doet als het formulier wél werkt maar de berichten toch niet aankomen
Soms is alles technisch in orde. SMTP werkt, SPF klopt, de logs tonen geen fouten. Maar de klant ontvangt de berichten niet.
Dan is het probleem aan de ontvangende kant. Mogelijke oorzaken:
- Het ontvangende mailaccount heeft een te klein opslagquotum en weigert nieuwe berichten
- De spamfilter van de ontvanger is te agressief ingesteld
- De ontvanger heeft een regel ingesteld die formulierberichten automatisch verplaatst of verwijdert
- Het e-mailadres in de formulierinstellingen heeft een typefout
Controleer het e-mailadres in de formulierinstellingen als eerste. Eén verkeerd teken en alles verdwijnt. Stuur daarna een testmail rechtstreeks naar het ontvangende adres, buiten het formulier om. Als die ook niet aankomt, is het probleem bij de ontvanger en niet bij WordPress.
Als de ontvanger een zakelijk mailaccount heeft bij een provider met strikte spamfilters, vraag dan of hij het verzendende adres kan toevoegen aan zijn whitelist. Dat lost het probleem in de meeste gevallen op.
En als alles werkt maar de klant toch klaagt dat hij berichten mist: zet een CC in op een tweede adres. Dan heb je altijd een backup-ontvanger, en weet je zeker dat het niet aan het formulier ligt.