define( 'SMTP_PASSWORD', 'MotDePasse2019!' );. Cette ligne, trouvée telle quelle dans le wp-config.php d’un site vitrine, illustre un réflexe très répandu : configurer l’envoi d’emails transactionnels (formulaires de contact, notifications de commande, réinitialisation de mot de passe) via un plugin SMTP, puis coller les identifiants du compte de messagerie directement dans le fichier de configuration de WordPress, par simplicité.
Le problème ne se limite pas à la délivrabilité des emails, déjà largement traitée ailleurs. Il tient à ce que représente réellement ce mot de passe : celui d’une boîte mail complète, avec potentiellement des années d’échanges professionnels, des factures, des accès à d’autres services via la fonction « mot de passe oublié ». Un wp-config.php mal protégé, un backup exporté par erreur dans un dossier public, ou une extension vulnérable qui lit les fichiers du système, et c’est cette boîte mail entière qui devient accessible.
Pourquoi wp-config.php n’est pas un coffre-fort
Ce fichier est censé rester inaccessible depuis le web grâce à la configuration du serveur, mais plusieurs scénarios le rendent lisible malgré tout : une erreur de configuration Nginx après une migration, une extension de sauvegarde qui exporte l’arborescence complète dans un fichier ZIP téléchargeable, ou simplement un accès FTP partagé avec un prestataire qui n’a pas besoin de voir ce mot de passe. Un fichier de configuration n’est jamais un espace de stockage de secrets à long terme, il est un point de passage.
Sortir le secret vers une variable d’environnement

La méthode la plus robuste consiste à ne plus écrire le mot de passe dans le code du tout, mais à le lire depuis l’environnement du serveur au moment de l’exécution :
// Dans wp-config.php
define( 'SMTP_USERNAME', getenv( 'WP_SMTP_USERNAME' ) );
define( 'SMTP_PASSWORD', getenv( 'WP_SMTP_PASSWORD' ) );
Le mot de passe lui-même est alors défini au niveau du serveur (fichier .env chargé par le pool PHP-FPM, variable définie dans la configuration du virtual host, ou secret injecté par l’hébergeur). Il ne transite jamais par un dépôt Git, ni par une sauvegarde de fichiers.
Vérifier que la lecture fonctionne avant de couper l’ancien réglage
Avant de retirer la valeur en dur, il faut confirmer que getenv() retourne bien la valeur attendue dans le contexte réel d’exécution de WordPress, pas seulement en ligne de commande. Un test simple :
add_action( 'admin_notices', function() {
if ( current_user_can( 'manage_options' ) && ! getenv( 'WP_SMTP_PASSWORD' ) ) {
echo '<div class="notice notice-error"><p>Variable SMTP absente de l\'environnement</p></div>';
}
});
Ce garde-fou temporaire évite de découvrir la panne au moment où un client passe commande, un dimanche soir.
Une alternative quand les variables d’environnement ne sont pas disponibles
Sur certains hébergements mutualisés, l’accès aux variables d’environnement du serveur est limité. Dans ce cas, un fichier de secrets placé en dehors de la racine web, chargé explicitement par wp-config.php, reste une solution correcte :
- Un fichier
wp-secrets.phpstocké un niveau au-dessus du dossier public, hors de portée d’Apache ou Nginx. - Un
requireexplicite depuiswp-config.php, jamais versionné dans le dépôt du projet. - Des permissions restreintes sur ce fichier (lecture seule pour l’utilisateur du serveur PHP).
Changer le mot de passe après la migration
Une fois le nouveau mécanisme en place, il reste une étape que beaucoup sautent par flemme : changer le mot de passe SMTP lui-même. S’il a circulé en clair dans un fichier, dans un ticket de support ou dans un export de sauvegarde, il faut le considérer comme potentiellement compromis, même si rien ne le prouve.
Un identifiant qui a un jour existé en clair dans un fichier ne redevient jamais « sûr » simplement parce qu’on l’a déplacé ailleurs : il faut le changer.
Notre verdict
Sortir un identifiant SMTP de wp-config.php prend une demi-heure. Le risque qu’il fait courir, lui, peut durer des années si la boîte mail associée reste active. Le réflexe à adopter sur tout futur projet : aucun secret ne se code en dur, il se lit depuis l’environnement, point final.