Contact form not sending sur WordPress - Causes & solutions
Rédigé par Soulaimane Aattar — 850+ interventions e-commerce documentées
· Mis à jour le 14 juin 2026 Versions concernées : WordPress 5.x, 6.x et toutes versions sous PHP 7.4+ ; Contact Form 7, WPForms, Gravity Forms et Fluent Forms (qui reposent tous sur wp_mail)
Un formulaire de contact WordPress qui ne marche plus, c'est rarement une page qui plante : c'est un message « Message envoyé » qui s'affiche au visiteur pendant que le mail, lui, n'arrive jamais. Tu perds des demandes de devis, des questions avant achat et des leads B2B sans le moindre signal d'alarme. Le pire panne silencieuse : tout semble fonctionner.
Il faut d'abord séparer deux incidents que les guides francophones mélangent. (A) Le formulaire affiche un succès mais aucun mail n'arrive : c'est un problème d'envoi / délivrabilité, le cas le plus fréquent. (B) Le formulaire plante visuellement : roue qui tourne sans fin, erreur rouge, bouton inerte : c'est un problème technique JS/plugin/config. Le traitement n'est pas le même, alors commence par identifier ton camp.
Ce guide te donne l'arbre de triage, les commandes pour lire les vrais logs d'envoi, le tableau des hébergeurs français qui bloquent le SMTP sortant (la cause racine n°1 en France), et le correctif du piège Gmail/Yahoo de 2024 qui fait disparaître tes mails depuis que l'authentification DMARC est devenue obligatoire.
Contexte technique
La fonction wp_mail() utilise par défaut PHP mail() sans authentification SMTP, ce qui conduit dans 80% des cas à des emails filtrés spam ou refusés par les gros providers (Gmail, Outlook, Orange). Depuis février 2024, Gmail et Yahoo imposent SPF, DKIM et DMARC pour tout expéditeur envoyant plus de 5 000 emails par jour : un formulaire WordPress sans authentification SMTP (WP Mail SMTP, FluentSMTP ou Postmark) voit ses leads disparaître silencieusement. Les plugins Contact Form 7, WPForms, Gravity Forms reposent tous sur wp_mail et héritent donc du problème.
formulaire wordpress ne marche paswordpress contact form issuewordpress smtp bug
Cet incident peut impacter votre chiffre d’affaires.
Si ce problème touche le checkout, la disponibilité ou la performance, la perte de revenu peut être immédiate.
Note expert BugRescue
Un formulaire qui affiche « Message envoyé » côté front ne prouve rien côté livraison. Mettez en place systématiquement un log d'envoi (WP Mail Logging) et un monitoring de livraison (Postmark, SendGrid) avant de considérer qu'un formulaire est fonctionnel.
Prise en charge par des experts avec 15+ ans d’expérience e-commerce.
Équipe senior full-stack PrestaShop, WooCommerce, Magento, Shopify et WordPress. Intervention rapide sur
incidents critiques et stabilisation durable — France, Maroc, Belgique et Suisse.
Symptômes : comment confirmer le diagnostic
Avant toute manipulation, range ton problème dans l'un des deux incidents. Ils ont des causes opposées et un mauvais diagnostic te fait perdre des heures.
Incident A — l'envoi (le plus courant). Le visiteur voit « Merci, votre message a bien été envoyé ». Côté admin, rien n'arrive dans la boîte de réception. Ce n'est PAS une preuve de fonctionnement : le message de succès de Contact Form 7 ou WPForms s'affiche dès que wp_mail() rend la main, pas quand le serveur de messagerie a réellement accepté le mail. Le mail peut être parti en spam, avoir été rejeté par Gmail, ou n'avoir jamais quitté ton serveur.
Incident B — le plantage UI. La soumission tourne en boucle (spinner infini), affiche un cadre rouge d'erreur, ou le bouton ne réagit pas. Là, le mail n'est même pas tenté : c'est du JavaScript, un conflit de plugin, une erreur AJAX (admin-ajax.php) ou des permaliens cassés.
Vérifie d'abord l'évidence pour l'incident A : le dossier Spam / Indésirables de la boîte destinataire, ainsi que l'adresse réellement utilisée. Confusion classique signalée sur les forums FR : l'adresse de l'admin (Réglages » Général) n'est pas forcément celle du champ destinataire du formulaire (Contact » Formulaires de contact » onglet Mail » champ « À »).
Incident A — succès affiché, aucun mail : problème SMTP / délivrabilité (sections Diagnostic et Solutions §SMTP).
Incident B — spinner infini ou erreur rouge : conflit plugin / thème / AJAX / permaliens (Solutions §conflit).
Mail dans les indésirables du destinataire : SPF/DKIM manquants, pas une panne d'envoi.
Couleur du bandeau CF7 : vert = succès, jaune/orange = problème de validation ou de config mail, rouge = échec d'envoi ou erreur réseau.
Impact business immédiat
Un formulaire KO ne déclenche aucune alerte : c'est ce qui le rend dangereux. Contrairement à un site en erreur 500, personne ne te prévient. Tu découvres la panne quand un client râle « je vous ai écrit il y a une semaine » ou quand le pipeline commercial se vide sans raison apparente.
Pour un site e-commerce ou de services, chaque formulaire perdu est une demande de devis, une question avant achat ou un contact SAV évaporé. La durée moyenne de détection d'une panne d'envoi silencieuse se compte en jours, parfois en semaines : autant de leads jamais rappelés et de chiffre d'affaires invisible.
Leads et demandes de devis perdus sans aucune trace ni notification.
Baisse progressive du pipeline commercial, attribuée à tort à une « mauvaise période ».
Opportunités B2B et SAV manquées, dégradant la réputation (« ils ne répondent jamais »).
Aucune détection immédiate : la panne dure jusqu'au signalement d'un tiers.
Causes classées par probabilité
Voici l'ordre statistique réel, du plus fréquent au plus rare. Diagnostique dans cet ordre, tu résoudras 90 % des cas avant la moitié de la liste.
1. wp_mail() s'appuie sur PHP mail() sans authentification SMTP : ~80 % des emails filtrés en spam ou refusés par Gmail/Outlook/Orange. Cause n°1 absolue.
2. L'hébergeur français bloque le SMTP sortant ou le port 25/587 (OVH, o2switch, Ionos selon l'offre) : cause racine n°1 spécifique à la France, souvent invisible dans les guides EN.
3. Champ expéditeur (From) invalide : adresse @gmail.com / @yahoo.fr en From, ou wordpress@domaine par défaut. Rejet renforcé depuis février 2024.
4. SPF / DKIM / DMARC absents ou erronés sur le domaine : mails marqués spam ou rejetés.
5. Conflit de plugin ou de thème (incident B) : JS cassé, AJAX en échec.
6. Anti-spam mal réglé : clés reCAPTCHA/Turnstile invalides, ou pare-feu (Wordfence) qui bloque admin-ajax.php.
7. Permaliens cassés ou cache servant une page de soumission obsolète (incident B).
8. Mise à jour récente : WordPress, PHP < 7.4 ou plugin incompatible (le « ça marchait avant »).
Diagnostic : les commandes à lancer
Objectif : savoir si le mail QUITTE ton serveur. Tant que tu n'as pas cette réponse, tu navigues à l'aveugle. Trois pistes : les logs serveur, un log applicatif, et un test SMTP isolé.
1) Vérifier la file et les logs mail côté serveur (SSH). Si tu as un accès SSH, c'est la vérité terrain. Cherche une trace de l'envoi au moment du test :
2) Tester directement la fonction d'envoi de PHP, sans passer par le formulaire, pour isoler WordPress de la couche mail :
3) Vérifier l'authentification du domaine (SPF/DKIM/DMARC) depuis n'importe quelle machine. Un SPF absent = mails en spam garantis :
4) Activer un log applicatif quand tu n'as pas de SSH. Installe « WP Mail Logging » ou utilise WP Mail SMTP » Réglages » Email Log. Chaque soumission crée une ligne : statut « Sent » signifie que wp_mail a rendu la main sans erreur (≠ livré), « Failed » te donne le message d'erreur SMTP exact (auth refusée, connexion refusée sur port 587, etc.).
5) Lire le résultat. Si le test SMTP de WP Mail SMTP (Outils » Test d'email) échoue avec « Could not connect to SMTP host » ou « Connection timed out », c'est ton hébergeur qui bloque le port (voir section hébergeurs). Si c'est « SMTP Error: Could not authenticate », c'est un mot de passe d'application erroné.
Lire les logs mail serveur (SSH, mutualisé ou VPS)
# File d'attente Postfix/Exim et logs au moment du test
mailq | tail -n 20
# Chercher la trace d'un envoi (adapter le chemin selon l'hébergeur)
sudo tail -n 100 /var/log/mail.log | grep -i "status="
# o2switch / cPanel : exim
sudo tail -n 100 /var/log/exim_mainlog | grep -i "<= \|=> \|** "
# Filtrer les rejets et différés
grep -iE "reject|deferred|bounced|timed out" /var/log/mail.log | tail -n 30
Tester wp_mail et PHP mail() en isolation (WP-CLI)
# Via WP-CLI : teste la pile wp_mail() complète (plugins SMTP inclus)
wp eval 'var_dump( wp_mail( "[email protected]", "Test wp_mail", "Corps de test depuis WP-CLI" ) );'
# true = wp_mail a accepte l'envoi (ne garantit pas la livraison)
# false = echec immediat -> lire l'erreur ci-dessous
wp eval 'add_action("wp_mail_failed", function($e){ error_log( print_r( $e->get_error_message(), true ) ); }); wp_mail("[email protected]","Test","x");'
# Test brut PHP mail() hors WordPress (isole la couche serveur)
php -r 'var_dump( mail("[email protected]","Test PHP mail","corps") );'
Vérifier SPF / DKIM / DMARC du domaine
# SPF : doit lister ton hebergeur / ton service SMTP
dig +short TXT votredomaine.com | grep -i spf
# DMARC : enregistrement _dmarc requis depuis 2024
dig +short TXT _dmarc.votredomaine.com
# DKIM (selecteur fourni par le service SMTP, ex: 'default', 'k1')
dig +short TXT default._domainkey.votredomaine.com
Solutions pas-à-pas
Applique dans l'ordre. La solution 1 (SMTP authentifié) règle à elle seule la grande majorité des incidents A.
Pour l'incident B (plantage UI), saute directement à l'étape 5.
1. Installer et configurer un SMTP authentifié. Installe WP Mail SMTP ou FluentSMTP. Lance l'assistant, choisis ton service (Brevo/Sendinblue, Postmark, Gmail API, ou le SMTP de ton hébergeur). Renseigne hôte, port (587 en TLS ou 465 en SSL), identifiant et mot de passe d'application. Active impérativement « Force From Email » et « Force From Name » pour écraser le From par défaut.
2. Corriger le champ expéditeur (From). Le From doit être une vraie boîte de TON domaine : [email protected], jamais [email protected] ni une adresse @gmail.com/@yahoo.fr. Dans Contact Form 7 : Contact » Formulaires » onglet Mail » champ « De ». Mets [email protected] et place l'adresse du visiteur dans « Reply-To: [your-email] » via la section En-têtes additionnels.
3. Authentifier le domaine (SPF/DKIM/DMARC). Dans la zone DNS de ton domaine : ajoute l'enregistrement SPF fourni par ton service SMTP, les clés DKIM (CNAME ou TXT), et un DMARC minimal : v=DMARC1; p=none; rua=mailto:[email protected]. Sans ça, Gmail/Yahoo classent ou rejettent depuis 2024.
4. Envoyer un email de test et lire le log. WP Mail SMTP » Outils » Test d'email vers une adresse Gmail ET une adresse pro. Confirme l'arrivée hors spam, puis ouvre l'en-tête du mail reçu : SPF=pass, DKIM=pass, DMARC=pass doivent apparaître. Tant que ces trois ne sont pas « pass », continue.
5. Tester un conflit de plugin / thème (incident B et A persistant). Active le thème par défaut (Twenty Twenty-Four). Désactive tous les plugins SAUF le formulaire et le SMTP. Re-teste. Si ça remarche, réactive un par un jusqu'à trouver le coupable (souvent un cache agressif, un pare-feu, ou un autre plugin SMTP en doublon).
6. Débloquer l'anti-spam et l'AJAX. Vérifie les clés reCAPTCHA/Turnstile (Contact » Intégration) : une clé invalide bloque la soumission silencieusement. Dans Wordfence, assure-toi que admin-ajax.php n'est pas bloqué. Pour CF7, n'accuse pas Akismet : il gère les commentaires, pas la soumission CF7.
7. Réenregistrer les permaliens et vider le cache. Réglages » Permaliens » Enregistrer (sans rien changer) régénère les règles de réécriture. Vide ensuite tout cache (plugin + CDN) pour éviter qu'une page de soumission obsolète soit servie.
8. Si rien ne part : c'est l'hébergeur. Si le test SMTP échoue en timeout/connexion refusée, ouvre un ticket support pour faire débloquer l'envoi sortant ou le port 587/465 (voir tableau ci-dessous).
En-têtes additionnels Contact Form 7 (onglet Mail)
Reply-To: [your-email]
Return-Path: [email protected]
# Champ « De » : [email protected]
# (jamais [your-email] ni une adresse @gmail.com en expediteur)
Spécificités par hébergeur français
C'est le trou des guides anglophones et l'angle qui résout le plus de cas en France. Citation littérale d'un forum WPFR après des heures de diagnostic : « Problème réglé. OVH avait bloqué l'envoi de mails. » Avant de soupçonner ton code, vérifie si ton hébergeur bloque le SMTP sortant.
Règle générale : le port 25 est presque toujours bloqué en mutualisé. Utilise le SMTP authentifié de l'hébergeur (ou d'un tiers) sur le port 587 (TLS) ou 465 (SSL).
OVH (mutualisé) : envoi via PHP mail() souvent bridé/bloqué. Utilise ssl0.ovh.net en 587/465 avec une adresse mail OVH authentifiée. Si rien ne part malgré une config correcte, ouvre un ticket : un blocage anti-spam sortant peut être actif sur le compte.
o2switch : serveur Exim local autorisé, mais délivrabilité faible sans SMTP authentifié. SMTP : mail.votredomaine.com en 587/465. Logs consultables via cPanel » Email Deliverability (et exim_mainlog en SSH).
Hostinger : PHP mail() limité en volume. SMTP : smtp.hostinger.com en 587. Active SPF/DKIM depuis hPanel (générés automatiquement pour les boîtes Hostinger).
Ionos (1&1) : port 25 bloqué, SMTP authentifié obligatoire : smtp.ionos.fr en 587/465. Vérifie que la boîte d'envoi existe bien côté Ionos.
Gandi : SMTP mail.gandi.net en 587, authentification obligatoire. SPF/DKIM à activer dans l'interface Gandi Mail.
Spécificités par version
Le cas « tout marchait, cassé après une mise à jour » se relie presque toujours à une incompatibilité de version.
PHP : WordPress moderne exige PHP ≥ 7.4 (recommandé 8.1+). Sous une version trop ancienne, la pile mail de certains plugins échoue silencieusement. Vérifie via Outils » Santé du site » Info » Serveur. Exigences serveur citées : PHP ≥ 7.4, MySQL ≥ 5.7 ou MariaDB ≥ 10.4.
WordPress 5.x vs 6.x : sur 6.x, l'éditeur de blocs peut imbriquer le shortcode du formulaire dans un bloc mal converti après migration : re-teste en éditant le bloc en HTML brut. Le hook wp_mail_failed (depuis WP 4.4) reste la méthode fiable pour capturer l'erreur, quelle que soit la version.
Plugins : après une mise à jour majeure de Contact Form 7 ou WPForms, une clé reCAPTCHA v2/v3 mal migrée bloque la soumission. Si la panne suit pile une mise à jour, fais un rollback du plugin (WP Rollback) pour confirmer la corrélation avant d'investiguer plus loin.
Localhost : un formulaire ne peut PAS envoyer en local (MAMP/Local/XAMPP) sans serveur mail configuré : c'est normal, pas un bug. Teste toujours la délivrabilité en environnement de prod ou préprod.
Quand appeler un expert
Tu as configuré le SMTP, corrigé le From, posé SPF/DKIM/DMARC, et pourtant les mails arrivent encore en spam ou pas du tout ? Ou le test SMTP échoue en timeout et le support hébergeur renvoie la balle ? À ce stade, le problème est souvent une combinaison délivrabilité + config serveur qui demande un diagnostic terrain (lecture des logs Exim/Postfix, en-têtes complets, réputation IP).
BugRescue (Soulaimane Aattar, fondateur) intervient sur ces cas : audit de la chaîne d'envoi de bout en bout, mise en place d'un SMTP transactionnel fiable avec monitoring de livraison, et déblocage côté hébergeur. L'objectif : un formulaire dont chaque soumission est tracée et dont la livraison est prouvée, pas seulement affichée.
Mails toujours en spam malgré SPF/DKIM/DMARC en « pass ».
Blocage hébergeur que le support ne lève pas, ou IP serveur sur liste noire.
Besoin d'un monitoring de livraison et d'alertes sur échec (Postmark/SendGrid).
Perte de leads à fort enjeu : il faut prouver et garantir la livraison, pas deviner.
FAQ
Pourquoi mon formulaire dit « message envoyé » mais je ne reçois rien ?
Parce que le message de succès s'affiche dès que wp_mail() rend la main, pas quand le mail est livré. Le mail est probablement parti en spam, a été rejeté par Gmail/Yahoo (From invalide ou SPF/DKIM manquants), ou n'a jamais quitté ton serveur car l'hébergeur bloque le SMTP sortant. Active un log d'envoi pour trancher.
Quelle adresse mettre dans le champ « De » de Contact Form 7 ?
Une vraie boîte de ton domaine, comme [email protected]. Jamais l'adresse du visiteur, jamais une adresse @gmail.com ou @yahoo.fr en expéditeur : elles sont rejetées depuis 2024. Mets l'email du visiteur dans Reply-To via les en-têtes additionnels.
Pourquoi mes mails de formulaire ne partent plus vers Gmail/Yahoo depuis 2024 ?
Depuis février 2024, Gmail et Yahoo imposent SPF, DKIM et DMARC pour accepter les emails. Un formulaire WordPress sans SMTP authentifié, ou avec un From en @gmail.com, échoue à l'authentification et voit ses mails classés en spam ou rejetés silencieusement. Configure un SMTP authentifié et ajoute SPF/DKIM/DMARC sur ton domaine.
Mon hébergeur peut-il bloquer l'envoi des mails du formulaire ?
Oui, et c'est la cause racine n°1 en France. OVH, Ionos et d'autres bloquent souvent le port 25 ou bridtent PHP mail() en mutualisé. Si le test SMTP échoue en timeout ou connexion refusée, passe sur le port 587/465 avec authentification, et au besoin ouvre un ticket pour faire débloquer l'envoi sortant.
Pourquoi le formulaire reste bloqué sur la roue qui tourne ?
C'est l'incident technique (B), pas un problème d'envoi. La requête AJAX vers admin-ajax.php échoue : clé reCAPTCHA/Turnstile invalide, conflit de plugin, pare-feu (Wordfence) qui bloque l'AJAX, ou permaliens cassés. Teste avec le thème par défaut et tous les plugins désactivés sauf le formulaire, puis réenregistre les permaliens.
Faut-il changer de plugin de formulaire pour régler le problème ?
Rarement. Contact Form 7, WPForms, Gravity Forms et Fluent Forms reposent tous sur wp_mail() et héritent du même problème d'envoi. Commence par stabiliser le SMTP et tracer les envois : dans la plupart des cas, la cause est la config mail ou l'hébergeur, pas le plugin.