Doel
Aan het einde van deze walkthrough heb je een WordPress-site die alle uitgaande berichten, inclusief contactformulier-notificaties, wachtwoord-resets en WooCommerce-bestelbevestigingen, via een geauthentiseerde SMTP- of API-verbinding met een externe mailprovider verstuurt. Je hebt de bezorging geverifieerd met een echte testmail, en je weet waar je in het log van de plugin moet kijken als er later iets stukgaat.
Wat je nodig hebt
- Administrator-toegang tot WordPress op
/wp-admin/. - Rechten om plugins te installeren (shared hosting en managed WordPress-pakketten voldoen allebei).
- Een account bij één verzendprovider. Dit artikel behandelt Gmail (gratis, beperkt volume), SendGrid, Mailgun, Amazon SES en Postmark. Kies er één voor je begint.
- Toegang tot de DNS-zone van je domein (via je registrar of je DNS-provider). Die heb je nodig om SPF- en DKIM-records te publiceren.
- Een echt werkend postvak op het domein waarvandaan je verstuurt, bijvoorbeeld
noreply@jouwsite.nl. Verstuur niet vanafwordpress@jouwsite.nlof vanaf het gmail-adres van de beheerder. Dewp_mail_from-documentatie van WordPress is daar expliciet over: "To avoid your email being marked as spam, it is highly recommended that your from domain match your website."
Als WordPress op dit moment überhaupt geen mail verstuurt, werk dan eerst waarom WordPress geen e-mail verstuurt en hoe je het oplost door, zodat je zeker weet dat het probleem op de transportlaag zit. Dit artikel gaat ervan uit dat de site en PHP-omgeving zelf gezond zijn. Wat je nodig hebt is een beter transport.
Waarom WordPress-mail zo vaak verdwijnt
Standaard geeft wp_mail() elk bericht door aan PHPMailer zonder ingesteld transport, waarna PHPMailer terugvalt op PHP's mail()-functie. PHP mail() schrijft het bericht vervolgens naar een lokale sendmail-compatibele binary, die het rechtstreeks probeert te relayen naar de mailserver van de ontvanger op poort 25.
Drie dingen gaan daar systematisch mis:
- Poort 25 is geblokkeerd. Vrijwel elke shared host en elke grote cloudprovider blokkeert uitgaande poort 25 op klant-VMs om spam-misbruik te voorkomen. RFC 5321 reserveert poort 25 voor server-to-server-relay, niet voor client-submission. Client-submission hoort op poort 587 met STARTTLS of op poort 465 met impliciete TLS. Zit poort 25 dicht, dan verlaat je bericht de host nooit.
- Het bericht heeft geen authenticatie. PHP
mail()verstuurt zonder SPF-alignment, zonder DKIM-handtekening en zonder DMARC-conform From-adres. Sinds Google's sender guidelines per februari 2024 van kracht zijn, wordt ongeauthentiseerde mail richting Gmail geweigerd of in spam gegooid. Outlook en Yahoo hanteren vergelijkbare regels. wp_mail()retourneert tochtrue. PHPMailer beschouwt het bericht als "verzonden" zodra de lokale MTA het accepteert, ongeacht of er stroomafwaarts nog iets mee gebeurt. Dat verklaart waarom het symptoom stilte is, geen foutmelding.
De oplossing is om PHP mail() helemaal niet meer te gebruiken. Een WordPress SMTP-plugin haakt in via het pre_wp_mail-filter (WordPress 5.7.0) of de oudere phpmailer_init-action (WordPress 2.2.0) en vervangt de default mailer door een geauthentiseerde verbinding met een echte verzendservice. WordPress roept overal nog wp_mail() aan; de plugin onderschept die aanroep gewoon voor hij PHP mail() bereikt.
Welke plugin: FluentSMTP, WP Mail SMTP of Post SMTP
Alle drie doen ze in de kern hetzelfde. De praktische verschillen zitten in wat gratis is:
| Plugin | Gratis logging | Gratis multi-provider routing | Gratis Amazon SES | Kanttekeningen |
|---|---|---|---|---|
| FluentSMTP | Ja | Ja | Ja | Beste gratis pakket. Je kunt verschillende mailtypes via verschillende providers routeren zonder Pro-upgrade. |
| WP Mail SMTP | Alleen in Pro | Alleen in Pro | Alleen in Pro | Grootste install-base. Setup-wizard is heel toegankelijk voor first-time-gebruikers. |
| Post SMTP | Ja | Beperkt | Ja | Real-time failure-alerts (Slack, Teams, SMS) en een backup-SMTP-pad. |
In bijna elk geval kies ik FluentSMTP. Gratis logging verdient zichzelf al terug de eerste keer dat een klant zegt: "ik heb nooit een mail gekregen." De walkthrough hieronder gebruikt FluentSMTP; bij WP Mail SMTP en Post SMTP werken de concepten één-op-één hetzelfde, alleen de schermindeling verschilt.
Provider-walkthrough 1: Gmail (persoonlijk account of Google Workspace)
Gmail is de snelste route als je al een Google-account hebt, maar er zitten twee harde limieten aan vast: Google Workspace staat maximaal 2.000 berichten per 24 uur toe en persoonlijk Gmail beperkt je tot 500 unieke ontvangers per 24 uur. Prima voor een kleine bedrijfssite, niet genoeg voor WooCommerce op een drukke dag.
Voor je begint: wat Google in 2024 en 2025 heeft veranderd
Google heeft basic password-authenticatie (de "Less Secure Apps"-instelling) in meerdere stappen uitgefaseerd, met de definitieve cutoff op 14 maart 2025. Na die datum authentiseert je gewone Google-wachtwoord helemaal niet meer via SMTP, op geen enkel accounttype.
Twee paden werken nog wel:
- OAuth2 via de eigen Gmail/Google Workspace-verbinding van FluentSMTP. Meest robuust; er worden geen wachtwoorden in WordPress opgeslagen.
- App Passwords, 16-karakter tokens die je specifiek voor third-party apps genereert. Google zegt in het eigen transitiedocument expliciet: "You will no longer use a password for access (with the exception of app passwords)." App Passwords vereisen wel 2-Step Verification op het Google-account.
Allebei worden ze nog ondersteund. Kies OAuth2 als je de plugin redirect-rechten op het Google-account kunt geven. Kies App Passwords als het account al 2FA heeft en je geen OAuth-gedoe wil.
Instellen met OAuth2 (aanbevolen)
- In WordPress: ga naar Plugins > Nieuwe plugin, zoek FluentSMTP, installeer en activeer.
- Open Instellingen > FluentSMTP > Connections en klik Add Another Connection.
- Kies Gmail / Google Workspace.
- Vul de From Email in (het echte adres waarvandaan WordPress moet versturen, bijvoorbeeld
noreply@jouwsite.nl) en de From Name. - Open in een nieuw tabblad de Google Cloud Console, maak een nieuw project, activeer de Gmail API, maak een OAuth client ID van het type Web application en voeg
https://jouwsite.nl/wp-admin/options-general.php?page=fluent-mailtoe als Authorized redirect URI. Kopieer de Client ID en Client Secret. - Plak de Client ID en Client Secret terug in FluentSMTP en klik Authorize. Log in met het Google-account waarvandaan je wil versturen en geef de gevraagde scopes.
- Klik Save Connection Settings.
Verwacht resultaat: op het Connections-tabblad verschijnt een nieuwe rij met provider "Gmail" en het gekoppelde adres. Ga naar Test Email, stuur een bericht naar een ander postvak en controleer of het binnenkomt mét geldige DKIM-handtekening (zie de verificatiestap verderop).
Instellen met een App Password
- Zet in Google eerst 2-Step Verification aan op het account als dat nog niet aan staat.
- Ga naar myaccount.google.com/apppasswords en genereer een App Password. Geef het een herkenbare naam, bijvoorbeeld
FluentSMTP jouwsite.nl. Google toont een token van 16 karakters, zoiets alsabcd efgh ijkl mnop. Kopieer dat zonder de spaties. - Open in WordPress Instellingen > FluentSMTP > Connections en klik Add Another Connection.
- Kies Other SMTP.
- Vul in:
- SMTP Host:
smtp.gmail.com - SMTP Port:
587 - Encryption:
TLS - Auto TLS: aan
- Authentication: aan
- SMTP Username: je volledige Gmail- of Workspace-adres
- SMTP Password: het 16-karakter App Password dat je net hebt gegenereerd
- SMTP Host:
- Klik Save Connection Settings.
Verwacht resultaat: het Connections-tabblad toont een nieuwe SMTP-rij die naar smtp.gmail.com:587 wijst. Krijg je bij het opslaan een authenticatiefout? Dan is bijna altijd een typo in het App Password de oorzaak, of 2FA staat niet aan op het account.
Provider-walkthrough 2: SendGrid, Mailgun, Amazon SES of Postmark
Voor elk volume groter dan een handjevol transactionele mails per dag is een echte verzendservice het juiste antwoord. Deze providers regelen domain-authentication, bounce-verwerking, reputatie-monitoring en bezorging voor je. Elk heeft een SMTP-pad en meestal ook een API-pad. FluentSMTP praat met allebei.
Kies er één voor je begint
| Provider | Gratis tier (indicatie) | Sterktes |
|---|---|---|
| SendGrid | 100/dag gratis | Goed gedocumenteerd, groot ecosysteem, geschikt voor bulk. |
| Mailgun | Pay-as-you-go vanaf ongeveer 1.000/maand | Developer-vriendelijke API, sterke logging. |
| Amazon SES | Erg goedkoop na de eerste 62.000/maand vanaf EC2 | Goedkoopste op schaal, begint in sandbox-mode. |
| Postmark | Alleen trial, direct betaald daarna | Beste deliverability voor pure transactionele mail. |
Instellen met SendGrid (SMTP-mode)
- Maak een account aan op sendgrid.com en doorloop de sender-authentication-wizard voor het domein waarvandaan je verstuurt. Die publiceert de CNAME-records die SendGrid nodig heeft om namens jou DKIM-signing te doen.
- Ga in SendGrid naar Settings > API Keys en maak een key aan met het recht Mail Send. Kopieer de key meteen (begint met
SG.); je kunt hem daarna niet nog een keer inzien. - Open in WordPress FluentSMTP > Add Another Connection en kies SendGrid.
- Plak de API key en vul de geverifieerde From Email en From Name in.
- Klik Save Connection Settings.
Verwacht resultaat: een nieuwe connection-rij met provider "SendGrid". FluentSMTP roept de REST-API van SendGrid aan, dus je hebt geen open SMTP-poort vanaf je host nodig.
Instellen met Mailgun
- Maak een account aan op mailgun.com en voeg een verzenddomein toe. Mailgun geeft je vier DNS-records (SPF include, DKIM als CNAME of TXT, en optionele tracking-CNAMEs). Publiceer ze allemaal in je DNS-zone.
- Wacht tot Mailgun de records heeft geverifieerd (meestal 10 tot 30 minuten). Het domein moet Verified zijn voordat er iets bezorgd wordt.
- Ga naar Sending > Domain settings > API keys en kopieer de Private API key.
- Open in WordPress FluentSMTP > Add Another Connection en kies Mailgun.
- Vul de API key, het verzenddomein en de regio in (US of EU). De regio verkeerd zetten is een klassieker bij de eerste setup: een Mailgun EU-account authentiseert niet tegen de US-endpoint.
- Opslaan.
Verwacht resultaat: een nieuwe Mailgun-connection. Stuur een testmail; FluentSMTP zou een 200-response van de Mailgun-API moeten krijgen.
Instellen met Amazon SES
- Activeer in AWS Amazon SES in de regio die het dichtst bij je site ligt.
- Verifieer je verzenddomein door de DKIM-CNAMEs en de SPF-include te publiceren die SES je geeft. Verifieer ook het individuele adres als SES daarom vraagt.
- Kom uit de SES-sandbox. Nieuwe SES-accounts zitten standaard in sandbox-mode, wat je beperkt tot 200 berichten per 24 uur en alleen verzenden naar geverifieerde ontvangers toestaat. Open een production-access-verzoek via Account dashboard > Request production access en beschrijf kort waarvoor je SES gaat gebruiken. Goedkeuring duurt meestal een werkdag.
- Maak een IAM-user aan met het
AmazonSESFullAccess-beleid (of een strakkere variant), genereer een access key ID en secret access key en kopieer beide. - Open in WordPress FluentSMTP > Add Another Connection en kies Amazon SES.
- Vul de access key, secret key en regio in. Opslaan.
Verwacht resultaat: een nieuwe Amazon SES-connection. Stuur een testmail. Zit je nog in sandbox en stuur je naar een niet-geverifieerd adres, dan weigert SES met MessageRejected: Email address is not verified. Dat is het signaal dat je nog productie-toegang moet aanvragen.
Instellen met Postmark
- Maak een account aan op postmarkapp.com en maak een server voor je site aan (Postmark groepeert streams onder servers).
- Voeg je verzenddomein toe en publiceer het DKIM-TXT-record en het optionele Return-Path-CNAME dat Postmark geeft.
- Kopieer het Server API Token uit het tabblad API Tokens van de server.
- Open in WordPress FluentSMTP > Add Another Connection en kies Postmark.
- Vul het Server API Token en de geverifieerde From Email in.
- Opslaan.
Verwacht resultaat: een nieuwe Postmark-connection. De SMTP-referentie van Postmark documenteert poorten 25, 2525 en 587 met STARTTLS als je ooit op raw SMTP moet terugvallen. In FluentSMTP hoef je geen poort in te stellen; de plugin gebruikt de API.
Verifieer dat WordPress ook echt mail aflevert
Een plugin die zonder fouten opslaat is niet hetzelfde als een plugin die mail bezorgt. Doorloop deze verificatie elke keer dat je van provider wisselt.
Stap 1: stuur een testmail vanuit FluentSMTP
- Open Instellingen > FluentSMTP > Test Email.
- Vul een ontvanger in op een ander domein dan je WordPress-site, bij voorkeur een Gmail-inbox waar je zelf bij kan.
- Laat de default-connection staan.
- Klik Send Test Email.
Verwachte uitvoer: een groene "Success"-balk bovenaan het scherm.
Stap 2: inspecteer het bezorgde bericht in de ontvanger-inbox
Open de testmail in de Gmail-inbox waar je hem naartoe stuurde, klik op het drie-puntjes-menu naast de afzender en kies Show original. Gmail toont dan de volledige headers, en bovenaan staat een Authentication-Results-blok.
Je wil dat alle drie groen staan:
Authentication-Results: mx.google.com;
dkim=pass header.i=@jouwsite.nl ...
spf=pass (google.com: domain of bounce@jouwsite.nl ...) ;
dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=jouwsite.nl
Staat DKIM op fail of none, dan staan de DKIM-CNAMEs van je provider niet goed in je DNS-zone. Staat SPF op softfail, dan ontbreekt de SPF-include van je provider. Faalt DMARC, dan klopt de alignment niet: het From-domein hoort bij een ander domein dan de DKIM-handtekening. Pas in FluentSMTP het From-adres aan naar een postvak op hetzelfde domein dat de DKIM heeft getekend.
Stap 3: trigger een echte WordPress-mail en controleer of die ook aankomt
De test-mail bewijst dat de plugin-verbinding werkt. Een echte wp_mail()-aanroep bewijst dat WordPress zelf ook via de plugin routeert. Doe één van deze drie:
- Vraag een wachtwoord-reset aan voor je eigen adminaccount via
/wp-login.php?action=lostpassword. - Verstuur een test-contactformulier.
- Plaats een test-bestelling in WooCommerce.
Controleer daarna:
- Het bericht komt aan in het verwachte postvak.
- Het FluentSMTP-log (tab Email Logs) toont de verzending met status "Sent".
- Het From-adres matcht wat je hebt ingesteld, niet
wordpress@jouwsite.nl.
Werkt de testmail uit stap 1 wél, maar komt een wachtwoord-reset niet aan? Dan onderschept iets in WordPress de wp_mail()-aanroep voor FluentSMTP hem te zien krijgt. Deactiveer andere mail-gerelateerde plugins (security-plugins, oudere SMTP-plugins die je vergeten bent te verwijderen) en probeer opnieuw. Voor de bredere diagnose van wachtwoord-reset-problemen in WordPress, inclusief oorzaken die niks met SMTP te maken hebben, zie wachtwoord-reset werkt niet in WordPress.
Lees de e-maillogs als er later iets stukgaat
Het Email Logs-tabblad van FluentSMTP is het nuttigste debug-oppervlak van de hele plugin. Zet het aan en laat het aan staan.
Waar je op let als een gebruiker zegt: "ik heb geen mail gekregen":
- De logregel bestaat. Als hij bestaat, heeft WordPress
wp_mail()daadwerkelijk aangeroepen. Het probleem zit aan de bezorgkant: bounce, spam-plaatsing of filtering bij de ontvanger. - De logregel ontbreekt helemaal. WordPress heeft
wp_mail()nooit aangeroepen. Kijk verder stroomopwaarts: bij de plugin of de pagina die de mail had moeten triggeren. - Status is "Failed". FluentSMTP heeft een provider-fout gevangen. Klik op de rij voor de provider-response. Veelvoorkomend: verlopen API-key, DNS-records uit de zone gehaald of het From-adres aangepast naar iets wat de provider niet heeft geverifieerd.
Op sites die met echt geld te maken hebben (WooCommerce, membership-plugins) haak ik daarnaast wp_mail_failed in een must-use plugin zodat failures óók in wp-content/debug.log belanden, niet alleen in FluentSMTP. Maak via de bestandsbeheerder van je hostingpanel (of met een SFTP-client) het bestand wp-content/mu-plugins/log-mail-errors.php aan met de volgende inhoud. Bestaat de map mu-plugins nog niet, maak die dan eerst aan in wp-content:
<?php
// Logt elke wp_mail()-failure naar wp-content/debug.log
add_action( 'wp_mail_failed', function ( WP_Error $error ) {
error_log( 'wp_mail_failed: ' . $error->get_error_message() );
error_log( print_r( $error->get_error_data(), true ) );
} );
wp_mail_failed is toegevoegd in WordPress 4.4.0 en vuurt elke keer dat PHPMailer een exception gooit. Dat vangt ook failures die gebeuren voordat de plugin ze logt.
Authentiseer je verzenddomein met SPF, DKIM en DMARC
SMTP krijgt het bericht bij de provider. Domain-authentication krijgt het bericht van de provider geaccepteerd bij Gmail, Outlook en Yahoo. Sinds Google's bulk-sender-regels per 1 februari 2024 gelden, is de praktische ondergrens voor elke WordPress-site SPF + DKIM + DMARC op het verzenddomein, ongeacht het volume.
Elke provider uit de walkthroughs hierboven geeft je de exacte records om te publiceren. In de basis voeg je toe:
- Eén SPF TXT-record op het verzenddomein (de root). Meestal iets als
v=spf1 include:sendgrid.net include:_spf.google.com -all. Er is maar één SPF-record per domein toegestaan; meerdere providers voeg je samen in één record. - Eén of meer DKIM-records (meestal CNAME of TXT) op een provider-specifieke selector, bijvoorbeeld
s1._domainkey.jouwsite.nl. Het dashboard van de provider geeft je de exacte namen en waarden. - Eén DMARC TXT-record op
_dmarc.jouwsite.nl, begin metv=DMARC1; p=none; rua=mailto:dmarc@jouwsite.nl.p=noneis alleen monitoren; zodra je uit de DMARC-rapporten ziet dat legitieme mail een paar weken schoon binnenkomt, verhoog je het beleid naarp=quarantineen uiteindelijk naarp=reject.
Een uitgebreidere walkthrough van de drie records, inclusief hoe je meerdere SPF-includes samenvoegt en hoe je DMARC-rapporten leest, landt in een eigen KB-artikel. Tot die tijd: begin met de waarden die je provider je geeft en verifieer het via de "Show original"-check hierboven in Gmail.
WooCommerce en andere plugins: verder niks instellen
WooCommerce stuurt elke transactionele mail (nieuwe bestelling, afgeronde bestelling, klantfactuur, wachtwoord-reset, creditnota) via wp_mail(). De WooCommerce-documentatie is daar kort over: "WooCommerce triggers the wp_mail() function. This function signals WordPress to process the email. However, since WordPress isn't an email server, it delegates this task to PHP."
Dat betekent: zodra je FluentSMTP (of een andere WordPress SMTP-plugin) op WordPress-niveau hebt ingesteld, lopen WooCommerce-mails meteen via datzelfde pad. Je hoeft WooCommerce niet apart te configureren. Datzelfde geldt voor Contact Form 7, Gravity Forms, Fluent Forms, WPForms, BuddyPress, LearnDash en elke andere plugin die wp_mail() gebruikt: ze erven allemaal het transport dat je net hebt ingesteld.
De enige uitzondering zijn plugins die bewust om wp_mail() heen gaan, meestal door PHPMailer rechtstreeks aan te roepen of via cURL naar een externe API te sturen. Die zijn zeldzaam en worden meestal ook als zodanig gedocumenteerd. Vermoed je dat een plugin dit doet, kijk dan in de plugin-instellingen of er een aparte "email" of "SMTP"-sectie is.
Finale configuratie-checklist
Voor je dit als klaar afvinkt:
- [ ] FluentSMTP is geïnstalleerd, actief en ingesteld als primaire connection.
- [ ] Het From-adres is een echt postvak op je eigen domein, dat door een mens wordt gelezen of doorgestuurd.
- [ ] Een testmail uit FluentSMTP > Test Email komt aan in een externe inbox en slaagt voor SPF, DKIM en DMARC in Gmail's "Show original"-weergave.
- [ ] Een echte WordPress-mail (wachtwoord-reset, contactformulier, WooCommerce-bestelling) komt aan en verschijnt in FluentSMTP's Email Logs met status "Sent".
- [ ] SPF-, DKIM- en DMARC-records zijn gepubliceerd in de DNS van het verzenddomein.
- [ ] De retentie van de Email Logs staat op 30 tot 90 dagen. Lang genoeg om een late klacht uit te zoeken, kort genoeg om geen gevoelige berichtinhoud eeuwig te bewaren.
- [ ] De
wp_mail_failed-mu-plugin staat erop bij sites waar omzet aan hangt.
Faalt er iets op die lijst, ga dan terug naar de Verifieer-sectie hierboven en werk die op volgorde door. De klassieker is DKIM: de provider heeft de keys gegeven, jij hebt de CNAMEs overgezet, maar je DNS-provider heeft ongemerkt de trailing dot laten vallen of de waarde tussen quotes gezet. Controleer de gepubliceerde records in het configuratiescherm van je DNS-provider, of gebruik een online tool zoals MXToolbox DKIM Lookup. Heb je SSH-toegang: draai dig CNAME s1._domainkey.jouwsite.nl om te bevestigen dat het record goed resolvet, voor je concludeert dat de plugin stuk is.