WordPress contactformulier stuurt geen mail is de melding die ik het vaakst binnenkrijg van ondernemers die zelf hun site beheren. Vorige week donderdag mailde een klant uit Hulst: “Ik heb al drie weken geen offerteaanvraag binnen. Bezoekers zeggen dat het formulier bevestigt, maar bij mij komt niks aan.” Frustrerend, want je verliest leads zonder dat je het merkt.
In dit stuk leg ik uit wat er onder de motorkap gebeurt. Spoiler: PHP mail() is bijna nooit de oplossing. Je leest hoe ik systematisch diagnostiseer en welke SMTP-provider bij welke situatie past.
Daarna richt je SPF, DKIM en DMARC juist in bij Cloudflare, TransIP, Combell of Hostinger. Reken op 45 tot 90 minuten van diagnose tot een werkende setup met mail-tester score 10/10.

Wat er precies gebeurt onder de motorkap
Voordat je begint met plugins toevoegen, moet je begrijpen waar mail-versturen in WordPress technisch fout gaat. Er zijn drie klassen problemen die ik in mijn praktijk verreweg het vaakst tegenkom.
1. PHP mail() faalt of wordt geblokkeerd. WordPress gebruikt standaard de PHP-functie mail() via de wp_mail-abstractie. Die functie levert de e-mail rechtstreeks af via de mailserver van je hosting, zonder authenticatie.
Bij Antagonist, Combell, TransIP en Hostinger is mail() de laatste jaren steeds strenger geworden: veel providers accepteren alleen berichten van geverifieerde afzenders, of ze throttlen naar één mail per minuut.
Sinds de Google en Yahoo bulk sender requirements van februari 2024 weigeren Gmail en Outlook niet-geauthenticeerde mail standaard. Dat geldt zodra je meer dan 5000 berichten per dag naar consumentenaccounts verstuurt. Voor MKB-sites geldt: ook 3 mails per dag komen niet aan als de authenticatie mist.
2. Ontbrekende of foute SPF, DKIM, DMARC. Je site verstuurt namens info@jouwbedrijf.nl, maar de verzendende server (die van je hosting of van SendGrid) staat nergens in de DNS-records vermeld als geautoriseerde afzender. Gmail, Outlook en Hotmail markeren zulke mail sinds 2024 als spoofing en gooien ‘m direct in de spam-map of weigeren ‘m helemaal. Sinds november 2025 geldt dit als harde regel: geen DMARC-record betekent permanente rejects.
3. Verkeerde From-header. Het contactformulier verstuurt vanaf wordpress@jouwsite.nl (WordPress-default) of vanaf het e-mailadres van de bezoeker die het formulier invulde. Beide zijn technisch spoofing, want je hosting mag niet namens de bezoeker versturen. De mail vertrekt wel, maar wordt aan de ontvangstkant geweigerd of in spam gegooid.
De fix voor alle drie is dezelfde: laat WordPress niet meer via PHP mail() versturen, maar via een geauthenticeerde SMTP-verbinding met correcte DNS-records. Dat is precies wat SMTP-plugins zoals WP Mail SMTP en FluentSMTP doen. FluentSMTP is 100% gratis en open-source zonder Pro-versie, WP Mail SMTP heeft een gratis versie plus Pro vanaf $49/jaar met email logging en tracking.
Stap 1: Testinzending doen en spam-map checken
Klinkt te simpel om te noemen, maar 20% van de “mail komt niet aan”-tickets die ik binnenkrijg zijn gewoon spam-map-issues. Doe dit.
- Vul je eigen contactformulier in met een testbericht (“TEST 3 augustus 2026”).
- Wacht 5 minuten.
- Check de inbox, dan spam/junk, dan “Alle mail” of “All Mail” in Gmail.
- Doe dezelfde test met een tweede ontvangstadres (bijvoorbeeld je gmail-account als je normaal Outlook gebruikt).
Als de mail in spam belandt: je hebt een deliverability-probleem, geen versturings-probleem. Ga direct naar stap 5 (mail-tester). Als de mail nergens verschijnt: door naar stap 2.
Waar blijft je contactformulier-mail?
Loop de verzendroute in de juiste volgorde na. Zo verander je niet tegelijk je formulier, SMTP en DNS.
Doe eerst een nieuwe testinzending en controleer ook spam, ongewenst en eventuele e-maillogs.
Controleer eerst of WordPress via PHP mail, SMTP of een mail-API verzendt.
Gebruik een nieuw bericht en test liefst naar meer dan één ontvangend domein. DNS-waarden verschillen per domein en mailprovider.
Een indicatie op basis van je antwoorden. Test na elke wijziging opnieuw en bewaar geen echte klantgegevens in openbare testberichten.
Stap 2: Enable email logging en test wp_mail direct
Installeer een van deze twee plugins, direct via WordPress-admin → Plugins → Add new.
- WP Mail SMTP (gratis versie is voldoende voor logging).
- FluentSMTP (volledig gratis, geen Pro-lock).
Beide houden bij wanneer WordPress een mail probeert te versturen, of dat lukte, en wat de foutmelding was. Zonder deze logging tast je in het duister.
Test daarna vanuit functions.php (via een child-theme of code-snippets plugin) of vanuit WP-CLI.
// Directe wp_mail test
$sent = wp_mail(
'jouwadres@gmail.com',
'Test vanuit WordPress ' . date('Y-m-d H:i:s'),
'Als deze mail aankomt werkt wp_mail. Als niet, check de logs.'
);
error_log( 'wp_mail return: ' . var_export($sent, true) );Of via SSH met WP-CLI.
wp eval "var_dump(wp_mail('jouwadres@gmail.com','WP-CLI test','body'));"Als wp_mail() false teruggeeft: PHP kan de mail niet eens aanbieden aan de mailserver. Check hosting-panel voor mailserver-configuratie. Als wp_mail() true teruggeeft maar de mail komt niet aan: het probleem zit in aflevering of authenticatie, niet in WordPress.
Stap 3: PHP mail() beschikbaarheid controleren via Site Health
Ga naar WordPress admin → Tools → Site Health → Info → Server en zoek naar de sectie over PHP en mail-functies. Voor een dieper beeld: klik het tabblad “Info” en scroll naar “Filesystem Permissions” en “PHP”.
Bij sommige hostings (met name goedkope shared plans zoals Vimexx starter of Hostnet basis) is mail() volledig uitgeschakeld op PHP-niveau. Je ziet dan bij disable_functions de string mail staan. In dat geval kan wp_mail nooit werken zonder externe SMTP.
Ook belangrijk: check dat je op een moderne PHP-versie zit. In augustus 2026 is PHP 8.3 stabiel en PHP 8.5 de nieuwste. Oude PHP 7.4-installaties hebben soms verouderde PHPMailer-versies die geen TLS 1.3 spreken en dus falen bij moderne SMTP-servers.
Stap 4: DNS-records controleren met mxtoolbox en dig
Voordat je één SMTP-plugin instelt: check wat je huidige DNS-records zijn. Twee tools:
Via mxtoolbox.com: vul je domein in, klik “SPF Record Lookup”, daarna hetzelfde voor DKIM en DMARC. De tool laat direct zien of records ontbreken of syntax-fouten hebben.
Via commandline:
# SPF-record
dig TXT jouwbedrijf.nl +short | grep spf
# DMARC-record
dig TXT _dmarc.jouwbedrijf.nl +short
# DKIM-record (selector varieert per provider, vaak "s1", "google", "brevo")
dig TXT s1._domainkey.jouwbedrijf.nl +shortAls deze commando’s niets teruggeven: er staan geen authenticatierecords. Dat is bijna zeker de reden dat mail wegvalt.
Stap 5: Mail-tester.com score meten
Ga naar mail-tester.com, krijg een willekeurig testadres, en stuur daar één keer een contactformulier-inzending naartoe (of gebruik de WP Mail SMTP test-tool om er direct heen te mailen). Klik “Then check your score.”
De score is uit 10. Wat je minstens wilt.
- 9+/10: goed, mail komt bij 95% van de ontvangers netjes aan.
- 8/10: acceptabel, incidenteel spam-issues.
- ≤7/10: onacceptabel, structureel deliverability-probleem.
Veelvoorkomende fails die mail-tester rapporteert.
- “You’re not authenticated” → SPF ontbreekt of noemt de verzendende server niet.
- “DKIM signature is missing” → DKIM-record ontbreekt of je SMTP-provider signeert niet.
- “You don’t have a DMARC record” → DMARC ontbreekt.
- “Your message is listed in Spamhaus” → hosting-IP staat op een blacklist, wissel van SMTP-provider.
- “Body contains ’test'” → false positive, geen echt probleem.

Stap 6: Hosting-specifieke mail-blokkades checken
Voordat ik SMTP-plugins ga configureren, check ik altijd of de hosting zelf een blokkade opwerpt. In mijn praktijk zie ik deze blokkades.
- Antagonist: blokkeert uitgaande mail van niet-geauthenticeerde afzenders sinds 2023. Je bent verplicht WP Mail SMTP of vergelijkbaar te gebruiken met hun eigen mailserver-credentials of externe SMTP.
- Combell: throttlet naar ongeveer 100 mails per uur, en weigert From-headers die niet matchen met een geverifieerde mailbox in het paneel.
- TransIP: PHP
mail()werkt op de meeste pakketten, maar zonder juiste From-header wordt de mail als bulk gemarkeerd. - Hostinger: business-plans staan mail wel toe, cheapest plans blokkeren
mail()volledig. - Cloudways/RunCloud/GridPane: geen mailserver ingebouwd, je bent verplicht externe SMTP te gebruiken.
Bel hosting-support en vraag expliciet: “Zijn er restricties op uitgaande e-mail via PHP mail() of SMTP-poorten 465/587?” Het antwoord bepaalt je aanpak.
SMTP-provider kiezen: wat past bij welke situatie
Voor het gros van mijn klanten is één van deze vier providers de juiste keuze. Prijzen zijn gecheckt in augustus 2026.
Brevo (voormalig Sendinblue): best voor MKB met laag volume
Brevo heeft een gratis tier van 300 mails per dag zonder tijdslimiet. Voor een contactformulier met 10 tot 100 inzendingen per dag is dat ruim voldoende. Contact-opslag tot 100.000 adressen. Nadeel: het Brevo-logo staat onderaan mails in de gratis versie, dat is voor transactionele mail meestal geen probleem.
Setup-stappen in FluentSMTP.
- Brevo-account aanmaken, ga naar SMTP & API → SMTP → kopieer het SMTP-wachtwoord.
- In WordPress: FluentSMTP → Add Connection → Brevo.
- Vul in: From email = een geverifieerd adres binnen jouw domein, Brevo-username, SMTP-key.
- Send test email vanuit FluentSMTP → controleer inbox.
SendGrid: waarschuwing, gratis tier is beperkt
SendGrid had jarenlang 100 mails/dag gratis-forever, maar sinds 2025 is dat een 60-dagen trial. Daarna moet je upgraden naar Essentials ($19.95/maand) of vertrekken. Voor klanten die al SendGrid gebruiken houdbaar, voor nieuwe setups zou ik nu Brevo of Amazon SES kiezen.
Postmark: best voor kritische transactionele mail
Postmark heeft de beste deliverability-reputatie in de markt. 100 mails/maand gratis-forever als testvolume. Betaalde plans: Basic $15/maand voor 10.000 mails, Pro $16.50/maand, Platform $18/maand. Overage op Basic is $1,80 per 1000, Pro $1,30, Platform $1,20. Voor een B2B-site met financiële transactiemails is Postmark’s snelheid (mediaan aflever-tijd onder 5 seconden) een groot voordeel.
Amazon SES: goedkoopst voor hoog volume
Amazon SES rekent $0,10 per 1000 mails, geen abonnement. Nieuwe accounts starten in sandbox mode: je kunt alleen naar geverifieerde adressen versturen. Via Service Quotas dien je een production-request in, AWS antwoordt binnen 1-3 werkdagen. Free tier is verlaagd van 62K naar 3K per maand voor nieuwe accounts in de eerste 12 maanden. Bij 50.000 mails/maand kost SES ongeveer $5, versus $35 bij Mailgun Foundation.
Google Workspace: als je al Workspace hebt
Als je al Google Workspace gebruikt voor je mailboxes: je kunt de SMTP-relay of gewoon Gmail SMTP gebruiken. Sinds 1 mei 2025 zijn “less secure apps” volledig uitgeschakeld, dus je moet OAuth 2.0 gebruiken of een app-password (bij Workspace met 2FA ingeschakeld). App-passwords zijn 16-tekens codes die je genereert in de beveiligingsinstellingen van het Gmail-account. Voor Workspace SMTP-relay: smtp-relay.gmail.com op poort 587 met TLS, tot 10.000 ontvangers per gebruiker per dag.
Mailgun: solide, iets duurder
Mailgun begint bij Basic $15/maand voor 10K mails, Foundation $35/maand voor 50K, Scale $90/maand voor 100K. Overage $0,80 per 1000. Betrouwbaar, maar voor MKB-volumes is Brevo goedkoper.
SMTP configureren in wp-config.php als constants
In plaats van credentials in de plugin-UI opslaan, doe ik voor productie-sites de configuratie via constants in wp-config.php. Dat betekent dat een compromised admin-account niet je SMTP-key kan uitlezen.
// wp-config.php — plaats BOVEN de "That's all, stop editing!" regel
// FluentSMTP via constants
define('FLUENTMAIL_LOAD_FROM_ENV', true);
define('FLUENTMAIL_BREVO_API_KEY', 'xkeysib-jouw-brevo-key-hier');
// WP Mail SMTP via constants (voor Brevo)
define('WPMS_ON', true);
define('WPMS_MAILER', 'sendinblue');
define('WPMS_SENDINBLUE_API_KEY', 'xkeysib-jouw-brevo-key-hier');
define('WPMS_MAIL_FROM', 'noreply@jouwbedrijf.nl');
define('WPMS_MAIL_FROM_NAME', 'Jouw Bedrijf');
define('WPMS_MAIL_FROM_FORCE', true);
define('WPMS_SET_RETURN_PATH', true);DNS-records: exacte syntax voor SPF, DKIM, DMARC
Hier komt het echte werk. Je moet drie TXT-records aan je domein toevoegen. De exacte waarden zijn provider-specifiek, maar de structuur is universeel.
SPF-record (één enkel TXT-record met naam @)
Als je Brevo én Google Workspace gebruikt.
v=spf1 include:_spf.brevo.com include:_spf.google.com -allSendGrid + Google Workspace.
v=spf1 include:sendgrid.net include:_spf.google.com -allAlleen Amazon SES.
v=spf1 include:amazonses.com -allBelangrijk: maximaal één SPF-record per domein. Als je er twee hebt, faalt SPF met een PermError. En maximaal 10 DNS-lookups totaal (elke include: telt als één).
DKIM-record
De DKIM-selector en waarde krijg je van je SMTP-provider. Voor Brevo.
- Naam:
mail._domainkey.jouwbedrijf.nl. - Type: TXT.
- Waarde:
k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...langekey...IDAQAB.
Voor SendGrid gebruik je twee CNAME-records (s1._domainkey en s2._domainkey) die naar SendGrid-hosts wijzen. Gebruik 2048-bit RSA voor nieuwe setups.
DMARC-record (naam: _dmarc)
Start altijd met een zachte policy en verscherp later.
v=DMARC1; p=none; rua=mailto:dmarc-reports@jouwbedrijf.nlNa 2-4 weken van reports lezen (via Postmark’s DMARC Digest of dmarcian.com) verscherp je.
v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@jouwbedrijf.nl; adkim=s; aspf=s; pct=100Uiteindelijk p=reject voor volledige bescherming, maar alleen als je zeker weet dat alle legitieme verzendbronnen SPF+DKIM correct hebben.
DNS-record toevoegen per provider
Cloudflare DNS
- Log in bij dash.cloudflare.com.
- Selecteer je domein → DNS → Records → Add record.
- Type: TXT, Name:
@(voor SPF) of_dmarc(voor DMARC), Content: de exacte record-waarde. - Zet Proxy status op DNS only (grijze wolk), want TXT-records moeten niet door de proxy.
- Save. Propagatie meestal binnen 60 seconden.
TransIP DNS
- Inloggen bij TransIP controlepaneel → Domeinen → jouwbedrijf.nl → DNS.
- Klik DNS-record toevoegen.
- Naam:
@, Type:TXT, Inhoud: waarde met aanhalingstekens rond de string. - Bewaar.
Combell DNS
- Controlepaneel → Domeinnamen → domein → Geavanceerd DNS-beheer.
- Nieuwe record → TXT → subdomein leeg of
_dmarc→ waarde. - Toevoegen. TTL default 3600.
Antagonist DNS
- Klantcentrum → Diensten → jouw domein → DNS-instellingen.
- TXT-record toevoegen via de editor.
- Save en wacht 5-15 minuten op propagatie.
Hostinger DNS
- hPanel → Domeinen → DNS / Nameservers.
- Manage DNS records → Add record → Type TXT → Name
@of_dmarc. - TTL 14400 default, na save actief binnen 60 seconden.
Check daarna altijd met mxtoolbox.com of de records correct doorkomen, en met mail-tester.com of de deliverability-score omhoog gaat.
Formulier-plugin specifieke tips
Contact Form 7 debug hook
Contact Form 7 geeft standaard geen bruikbare foutmeldingen. Voeg dit toe aan je child-theme’s functions.php om errors zichtbaar te maken in de browser-console.
add_action('wpcf7_ajax_json_echo', function($items, $result) {
if ('mail_failed' == $result['status']) {
global $phpmailer;
$items['errorInfo'] = $phpmailer->ErrorInfo;
error_log('CF7 mail_failed: ' . $phpmailer->ErrorInfo);
}
return $items;
}, 10, 2);Errors verschijnen nu in wp-content/debug.log en in de AJAX-response. Zet WP_DEBUG_LOG op true in wp-config.php om debug.log te activeren.
WPForms test-email
WPForms heeft een ingebouwde test-notification. Ga naar Forms → jouw formulier → Settings → Notifications → klik “Send Test Email” onderaan de notification-tab. Als deze test niet aankomt maar wp_mail wel werkt, controleer of de From-header niet gespoofd wordt (WPForms mag geen mail versturen namens de bezoeker).
Gravity Forms notification troubleshooter
Gravity Forms → Settings → Logging → toggle “Logging” aan. Daarna elk formulier → Settings → check “Log all form notifications”. Onder Forms → jouw formulier → Notifications zit een “Send Test” button, en logs staan in /wp-content/uploads/gravity_forms/logs/.
Fluent Forms + FluentSMTP
Beide van dezelfde ontwikkelaar, native integratie. Ga naar Fluent Forms → Global Settings → Email Settings → en zet daar de fallback-from-address gelijk aan je FluentSMTP-primary. Dat voorkomt spoofing-issues bij de From-header.
WordPress contactformulier stuurt geen mail: drie concrete scenario’s
Scenario A: Contact Form 7 werkt sinds hosting-migratie niet meer
Diagnose: De klant migreerde van Vimexx naar Cloudways. Op Vimexx werkte mail() via de shared mailserver, op Cloudways staat er geen mailserver. Contact Form 7 rapporteert “Bericht verzonden” (want CF7 checkt alleen of wp_mail true teruggeeft), maar er komt niets binnen.
Fix: Installeer FluentSMTP, verbind Brevo (gratis 300/dag ruim genoeg voor deze klant), voeg SPF-record toe met include:_spf.brevo.com, DKIM via Brevo dashboard, DMARC met p=none. Score op mail-tester ging van 3/10 naar 9,5/10 binnen twee uur werk.
Scenario B: WPForms send-test lukt, klant-notificaties komen niet aan
Diagnose: De admin-test-mail komt aan, maar de klantbevestiging niet. Klantbevestiging heeft {email} als From-header ingesteld, dus WordPress verstuurt namens de bezoeker (bijv. piet@ziggo.nl). SPF van jouwbedrijf.nl noemt uiteraard ziggo.nl niet als geautoriseerde afzender, dus Gmail weigert.
Fix: WPForms → Notifications → From Email veranderen naar noreply@jouwbedrijf.nl. De bezoeker’s mail gaat in Reply-To zodat “beantwoorden” nog steeds naar de bezoeker terugmailt. Direct opgelost.
Scenario C: Gmail rejects met “SPF fail” na Google 2024 update
Diagnose: Bestaande site die jaren gewerkt heeft, sinds april 2024 komen mails naar @gmail.com adressen niet meer aan. Bounce-message zegt: “550 5.7.26 This mail has been blocked because the sender is unauthenticated.”
Fix: Site had wel SPF, maar geen DMARC. Sinds Google’s februari 2024 sender requirements is DMARC verplicht voor iedere afzender die significant volume naar Gmail stuurt. DMARC-record toegevoegd met p=none en rua=mailto:dmarc-reports@jouwbedrijf.nl. Binnen 24 uur werd mail weer geaccepteerd.

Preventie: dit voorkomt herhaalfouten
Achteraf fixen is drie keer zoveel werk als vooraf goed opzetten. Mijn workflow voor iedere nieuwe WordPress-site:
1. Setup SMTP van dag 1. Zelfs op een net-live site met nul verkeer. FluentSMTP + Brevo gratis kost 20 minuten en voorkomt dat je pas na drie weken merkt dat testformulieren nooit werkten.
2. DNS-records vóór go-live. SPF, DKIM en DMARC met p=none staan idealiter al klaar voordat de eerste mail verstuurt. Verschijnen ze pas achteraf, dan heb je al schade opgelopen aan je afzender-reputatie bij Gmail en Outlook.
3. Google/Yahoo bulk sender compliance. Ook onder 5000/dag geldt: SPF én DKIM authenticated, en één van beide aligned met de From-domain. Los daarvan: one-click unsubscribe verplicht voor marketing-mail, unsubscribe-requests binnen twee dagen honoreren.
4. Log-plugin monitoring, wekelijkse check. Zowel WP Mail SMTP als FluentSMTP loggen alle uitgaande mail. Zet in je agenda: elke maandag 5 minuten log doorlopen. Failed mails zie je direct, en trends (bijvoorbeeld toenemende bounces vanaf één specifieke ISP) signaleren issues voordat het klant-klachten worden.
5. Test-mail cron per maand. Automatische mail-tester met een simpele wp-cron.
// Maandelijkse test in functions.php van child-theme
if (!wp_next_scheduled('lypii_monthly_mail_test')) {
wp_schedule_event(time(), 'monthly', 'lypii_monthly_mail_test');
}
add_action('lypii_monthly_mail_test', function() {
wp_mail(
'jouwadres@gmail.com',
'Automatische mail-test ' . date('Y-m-d'),
'Als deze mail aankomt werkt de SMTP-flow nog. Check spam-map.'
);
});6. Twee-maandelijkse mail-tester.com run. Ik doe dit standaard voor mijn onderhoudsklanten. Als de score onder 9 zakt, is er iets veranderd (nieuwe plugin die mail stuurt namens ander domein, DNS-wijziging, hosting die IP-range wijzigde).
Wanneer een echte webmaster inschakelen
Los dit zelf op als je binnen 90 minuten via de bovenstaande stappen bij een werkende SMTP-setup komt met mail-tester score 8+. Bel in deze gevallen iemand in.
- Je DNS-records correct staan maar mail nog steeds structureel niet aankomt (mogelijk IP-blacklist bij je hosting).
- Je een B2B-site hebt waar offerteaanvragen commercieel kritisch zijn en je twee uur ongelezen aanvragen op tafel liggen.
- Je een custom formulier gebruikt (zelf-gecodeerd of Formidable met complexe hooks) waar wp_mail niet standaard bereikt wordt.
- Je meerdere sites op dezelfde hosting hebt en één ervan blijkt gecompromitteerd en spamt (blacklist-risico voor alle sites op dezelfde IP).
Voor mijn klanten kost een complete mail-setup inclusief DNS, SMTP-plugin, mail-tester tuning tot 9+/10 en documentatie 1 tot 2 uur werk (€70 tot €140). Voor een site die 5 tot 50 leads per maand mist door mail-problemen, verdient dat zich vaak in één maand terug.
Vast door dit type incident?
Als je vastloopt in DNS-configuratie, of geen tijd hebt om te troubleshooten terwijl offerteaanvragen misschien wegvallen, stuur me een mail via /contact/. Ik regel mail-tester score 9+/10, SMTP-setup en DMARC-monitoring binnen twee uur, en factuur alleen de bestede tijd zonder minimumafname. Meer over mijn aanpak lees je op /diensten/ en op /wordpress-onderhoud/.



