vendredi 25 septembre 2026

À propos

Contact

Tests

Tester les emails envoyés par WordPress avec Mailpit, en local et en CI

Capturer les appels à wp_mail sans jamais risquer d'envoyer un vrai email de test, et vérifier automatiquement leur contenu dans vos suites PHPUnit et E2E.

Par Clément Hadrot • 16 juin 2025 • 5 min de lecture • Aucun commentaire
Tester les emails envoyés par WordPress avec Mailpit, en local et en CI

Un stagiaire, testant un nouveau workflow de réinitialisation de mot de passe sur l’environnement de recette d’un client, a par erreur déclenché l’envoi de dix-sept emails vers de vraies adresses clientes stockées en base, l’environnement de recette pointant encore vers le serveur SMTP de production suite à une copie de configuration mal filtrée. Rien de dramatique dans ce cas précis, mais l’incident a suffi à imposer une règle stricte : aucun environnement de test, qu’il soit local ou en CI, ne doit jamais pouvoir envoyer un email vers l’extérieur, point final.

Mailpit répond exactement à ce besoin : un serveur SMTP factice, léger, qui capture tous les emails envoyés sans jamais les transmettre réellement, et qui expose à la fois une interface web pour les consulter visuellement et une API HTTP pour les interroger automatiquement depuis une suite de tests.

Configurer WordPress pour envoyer vers Mailpit

WordPress utilise wp_mail() comme point d’entrée unique pour tous ses envois d’emails, qu’il s’agisse d’une notification de commande WooCommerce ou d’un email de réinitialisation de mot de passe. Rediriger ces envois vers Mailpit ne demande aucune modification du code de l’extension testée, seulement une configuration SMTP pointée vers l’instance Mailpit, via un plugin comme WP Mail SMTP ou une simple configuration de PHPMailer dans un fichier de configuration de test :

add_action( 'phpmailer_init', function ( $phpmailer ) {
    $phpmailer->isSMTP();
    $phpmailer->Host       = 'mailpit';
    $phpmailer->Port       = 1025;
    $phpmailer->SMTPAuth   = false;
    $phpmailer->SMTPSecure = false;
} );

En local comme en CI, Mailpit se lance en une commande, ou via un conteneur dédié dans le fichier docker-compose.yml du projet, ce qui garantit que le même point de configuration fonctionne identiquement sur les deux environnements.

L'essentiel à retenir : Aucun email de test ne doit jamais atteindre une vraie boîte de réception ; Mailpit expose une API HTTP pratique pour les assertions automatisées ; Le contenu HTML des emails mérite ses propres assertions ciblées

Interroger l’API Mailpit depuis un test PHPUnit

Mailpit expose une API REST simple, sans authentification par défaut sur un environnement de test isolé, qui permet de lister les messages reçus et de récupérer leur contenu détaillé. On l’utilise directement dans un test d’intégration pour vérifier qu’un email attendu a bien été envoyé, avec le bon destinataire et le bon contenu :

public function test_email_reinitialisation_envoye() {
    $this->vider_boite_mailpit();

    $utilisateur = $this->factory()->user->create( [ 'user_email' => 'client@example.test' ] );
    retrieve_password( get_userdata( $utilisateur )->user_login );

    $reponse  = wp_remote_get( 'http://mailpit:8025/api/v1/messages' );
    $messages = json_decode( wp_remote_retrieve_body( $reponse ), true );

    $this->assertCount( 1, $messages['messages'] );
    $this->assertSame( 'client@example.test', $messages['messages'][0]['To'][0]['Address'] );
    $this->assertStringContainsString(
        'réinitialiser votre mot de passe',
        $messages['messages'][0]['Snippet']
    );
}

La méthode vider_boite_mailpit(), appelée en début de test via l’appel DELETE de l’API sur /api/v1/messages, garantit que chaque test part d’une boîte vide, condition indispensable pour éviter qu’un email envoyé par un test précédent fausse le comptage du test suivant.

Vérifier le contenu HTML, pas seulement la présence de l’email

Un email dont le contenu HTML est cassé, un tableau de commande mal fermé, une image manquante, une balise non fermée qui fait s’effondrer toute la mise en page dans certains clients de messagerie, ne se détecte pas en vérifiant simplement qu’un email a été envoyé. On récupère le corps HTML complet via l’endpoint dédié de l’API Mailpit et on y applique des assertions ciblées :

$corps_html = wp_remote_retrieve_body(
    wp_remote_get( "http://mailpit:8025/api/v1/message/{$id_message}" )
);
$this->assertStringContainsString( '<table', $corps_html );
$this->assertStringNotContainsString( '{{', $corps_html ); // Aucun espace réservé de template oublié

Cette dernière assertion sur les accolades doubles a une vraie utilité pratique : elle détecte les templates d’emails qui utilisent un moteur de gabarit et qui laisseraient passer un espace réservé non résolu en cas d’erreur de variable, un défaut qui reste sinon invisible tant que personne n’ouvre l’email généré.

Intégrer Mailpit à un scénario E2E complet

Pour un test Playwright qui simule un parcours de commande complet, on peut interroger directement l’API Mailpit à la fin du scénario pour vérifier que l’email de confirmation de commande a bien été déclenché, avec le bon numéro de commande dans le contenu, sans avoir besoin de simuler une vraie boîte de réception :

  • Vider la boîte Mailpit au début du scénario, via l’API DELETE
  • Dérouler le parcours de commande normalement jusqu’à la confirmation
  • Interroger l’API Mailpit et vérifier la présence d’un email contenant le numéro de commande affiché à l’écran

Un environnement de test qui peut, même accidentellement, envoyer un vrai email n’est pas un simple détail de configuration : c’est un risque de confidentialité et de confiance client qui mérite d’être éliminé structurellement, pas seulement surveillé.

En résumé

Mailpit règle en même temps deux problèmes distincts : la sécurité, en garantissant qu’aucun email de test ne peut atteindre une vraie adresse, et la fiabilité des tests, en donnant un accès programmatique simple au contenu réel des emails envoyés. La mise en place ne demande qu’une configuration SMTP redirigée et quelques appels à une API HTTP déjà bien documentée, pour un gain de confiance qui dépasse largement cet effort initial.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi