Comment tester l’envoi de courriels alors qu’on ne dispose pas d’un serveur mail sur sa plateforme de développement WordPress ?
Une première solution consiste à installer un serveur mail en local, comme je l’ai expliqué dans le cas de WampServer.
Mais parfois, on ne dispose même pas d’une connexion internet. L’extension décrite dans cet article permet de simuler l’envoi de courriels, d’en récupérer le contenu et d’en visualiser les paramètres principaux.
Installer WordPress en local
Pour disposer de WordPress en local, c’est à dire sur un ordinateur personnel, il faut tout d’abord installer un serveur http, une Base de Données et le langage php.
On trouvera un article expliquant comment installer le package WampServer :
https://dfarnier.fr/wamp-installer/
Une fois WampServer installé, il est possible d’installer WordPress :
https://dfarnier.fr/installer-wordpress-sur-wampserver/
À ce moment, on dispose d’un outil de développement permettant de tester les évolutions du site, sans risque, avant de les transférer sur internet.
Parfois les évolutions nécessitent d’envoyer des courriels, or, WampServer ne contient pas de serveur mails. Dans l’article ci-dessous, j’ai expliqué comment installer un tel serveur mail :
https://dfarnier.fr/serveur-mail-wampserver/
Cette solution nécessite une connexion à Internet qui n’est pas toujours disponible. L’article ci-dessous montre comment tester des emails… sans qu’ils soient envoyés via internet.
L’extension décrite permet de visualiser le mail (émetteur, destinataire, contenu) mais aussi de simuler des cas de réussite ou d’échec de l’émission.
Haut de pageAfficher le courriel dans le fichier debug.log
Nous allons afficher son contenu dans le fichier journal (fichier log) en utilisant la fonction php : « error_log()« . Pour une installation WordPress, le fichier journal est appelé « debug.log » et se situe dans le répertoire « wp-content » (même si celui-ci a été déplacé), au même niveau que les répertoires « plugins », « themes »…

Le fichier « debug.log » n’est pas créé par défaut. S’il n’existe pas, il sera créé par la fonction error_log().
Pour que la fonction error_log() écrive dans le fichier « debug.log », deux constantes doivent être positionnées à « true » dans le fichier « wp-config.php » situé par défaut à la racine du site :
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);
Utiliser le crochet « phpmailer_init »
La fonction « wp_mail() » de WordPress permet d’envoyer des courriels. Elle se situe dans le ficher « wp-includes/pluggable.php ».
« wp-mail()) » effectue de nombreuses vérifications sur les paramètres du courriel (destinataire, contenu du message, format du message…) et propose plusieurs crochets permettant de paramétrer l’émission.
Nous intervenons au niveau du crochet « phpmailer_init » situé juste avant la phase d’émission du courriel :

Ajouter la fonction personnalisée « wpdf_mail_log » au crochet « phpmailer_init » :
add_action( 'phpmailer_init', 'wpdf_mail_log');
Écrire le courriel dans le fichier debug.log
Voici la fonction « wpdf_mail_log() » permettant d’écrire le courriel dans le fichier « debug.log » :
function wpdf_mail_log ($wpdf_phpmailer) { error_log('================ Début Mail ======================='); error_log('Emetteur : '.$wpdf_phpmailer->From); // Retrouver le destinataire du mail $wpdf_mail = print_r($wpdf_phpmailer, true); // récupérer le tableau des destinataires $wpdf_patt_to ="#\[to:protected\][^\n]+\n[^\n]+\n[^\n]+\n[^\n]+\n[^>]+> (.*)#"; preg_match($wpdf_patt_to, $wpdf_mail, $wpdf_mail_to); error_log('Destinataire (premier) : '.$wpdf_mail_to[1]); error_log('Sujet : '.$wpdf_phpmailer->Subject); error_log('Message : '.html_entity_decode($wpdf_phpmailer->Body)); error_log('================ Fin Mail ======================='); return ; } // fin fonction wpdf_mail_log
La variable « $wpdf_phpmailer« , passée à la fonction « wpdf_mail_log() » grâce au crochet « phpmailer_init« , contient l’objet « PHPMailer » qui décrit le courriel prêt à être envoyé :
add_action( ‘phpmailer_init‘, ‘wpdf_mail_log‘);
function wpdf_mail_log ($wpdf_phpmailer) {

La fonction php « error_log() » permet d’ajouter une chaîne de caractères dans le fichier log . Nous l’utilisons pour signaler le début du mail :
error_log(‘================ Début Mail =======================’);
Nous y ajoutons ensuite l’émetteur du message qui est contenu dans la propriété « From » de l’objet « $wpdf_phpmailer » :
error_log(‘Emetteur : ‘.$wpdf_phpmailer->From);
Nous ne pouvons pas faire de même pour le destinataire car la propriété « to » est une propriété protégée. Si on tente de l’atteindre directement (« $wpdf_phpmailer->to »), php renvoie une erreur :
PHP Fatal error: Cannot access protected property PHPMailer::$to
Nous contournons cette difficulté, en appelant la fonction php « print_r()« .
Nous récupérons les propriétés de l’objet « $wpdf_phpmailer » dans une chaîne de caractères en positionnant le deuxième paramètre à « true » :
$wpdf_mail = print_r($wpdf_phpmailer, true);
Nous extrayons l’adresse du premier destinataire au moyen d’une expression régulière. Voici le « patron » permettant d’isoler cette adresse :
$wpdf_patt_to = »#\[to:protected\][^\n]+\n[^\n]+\n[^\n]+\n[^\n]+\n[^>]+> (.*)# »;
preg_match($wpdf_patt_to, $wpdf_mail, $wpdf_mail_to);
La fonction php « preg_match() » a trois paramètres :
- le patron $wpdf_patt_to : chaîne de caractère codée appelée expression régulière qui permet de repérer et extraire une sous-chaîne (ici l’adresse mail du destinataire) depuis une chaîne « source » (ici le résultat du « print_r() » sur l’objet PHPMailer),
- la chaîne source $wpdf_mail : la chaîne depuis laquelle on va extraire une sous-chaîne définie par l’expression régulière,
- le tableau de résultat $wpdf_mail_to : un tableau dont :
- la première ligne contient la chaîne reconnue conforme à l’expression régulière ,
- la deuxième ligne contient la sous-chaîne extraite, c’est à dire ce qui correspond à « (.*) » dans le patron.
L’expression régulière commence parla sous-chaîne marquant le début de la description de la propriété « to » :
#\[to:protected\]
- # : marque le début de l’expression régulière (on le retrouve pour marquer la fin d’expression régulière : « (.*)#»,
- \[ : indique que « [ » correspond au caractère de crochet droit ouvrant, et non un symbole réservé pour coder une expression régulière,
- to:protected : est une chaîne de caractères que nous recherchons,
- \] : indique que « ] » correspond au caractère de crochet droit fermant, et non un symbole réservé pour coder une expression régulière.
Autrement dit, la recherche / extraction dans le corps du message s’effectuera sur une portion commençant par « [to:protected] ».
Pour mieux comprendre, voici ce qui est retourné par « print_r() » :

La portion d’expression régulière « [^\n]+\n » se décompose en :
- [^\n] : un caractère autre qu’un saut de ligne : « \n » désigne un saut de ligne, « ^ » indique qu’il ne faut pas le caractère qui suit,
- + : au moins un des caractères définis juste avant (donc les caractères qui ne sont pas des sauts de ligne),
- \n : un saut de ligne.
Autrement dit, nous sautons quatre lignes jusqu’à atteindre la définition du destinataire (« [0] => mon_mail@moi.fr »).
La portion d’expression régulière « [^>]+> » indique qu’il faut ensuite sauter tous les caractères jusqu’à atteindre le caractère supérieur « > ». On passe un caractère blanc et on prend les caractères restant sur la ligne ce qui correspond à l’adresse du premier destinataire.
Dans » (.*) », les parenthèses délimitent la chaîne à extraire, le point représente n’importe quel caractère jusqu’à un saut de ligne et l’étoile indique qu’il faut extraire de zéro à un nombre illimité de caractères.
Par défaut, le point permet d’extraire jusqu’à la fin de la ligne. L’option « s » permet d’effectuer une extraction sur plusieurs lignes en étendant les caractères pris en compte par le point.
Le code ci-dessous extrait puis affiche dans le fichier journal ce qui est compris entre « [to:protected] » et la propriété suivante « [cc:protected] » :
$wpdf_patt_to ="#\[to:protected\](.*)\[cc:protected\]#s"; preg_match($wpdf_patt_to, $wpdf_mail, $wpdf_mail_to); error_log(print_r(implode ($wpdf_mail_to), true));
Nous affichons le contenu du courriel, après l’avoir rendu plus lisible en exécutant la fonction « html_entity_decode() » :
error_log(‘Message : ‘.html_entity_decode($wpdf_phpmailer->Body));
Voici le même texte d’un courriel sans, puis avec, la fonction « html_entity_decode() ». On constate que le caractère « » apparaît d’abord sous forme codée puis pour ce qu’il représente : le caractère blanc :
Pour configurer votre mot de passe, rendez-vous à l’adresse suivante :
Pour configurer votre mot de passe, rendez-vous à l’adresse suivante :
Voici ce qu’on peut lire dans le fichier « debug.log » pour des courriels créés lors de l’inscription d’un nouvel utilisateur :
Haut de page[20-Mar-2016 09:30:42 UTC] ================ Début Mail =======================
[20-Mar-2016 09:30:42 UTC] Emetteur : wordpress@localhost
[20-Mar-2016 09:30:42 UTC] Destinataire (premier) : admin@adminwp.fr
[20-Mar-2016 09:30:42 UTC] Sujet : [Site local de test] Inscription d’un nouvel utilisateur
[20-Mar-2016 09:30:42 UTC] Message : Inscription d’un nouvel utilisateur sur votre site Site local de test :Identifiant : moi
E-mail : mon_mail@moi.fr
[20-Mar-2016 09:30:42 UTC] ================ Fin Mail =======================
[20-Mar-2016 09:30:42 UTC] ================ Début Mail =======================
[20-Mar-2016 09:30:42 UTC] Emetteur : wordpress@localhost
[20-Mar-2016 09:30:42 UTC] Destinataire (premier) : mon_mail@moi.fr
[20-Mar-2016 09:30:42 UTC] Sujet : [Site local de test] Votre identifiant et votre mot de passe
[20-Mar-2016 09:30:42 UTC] Message : Identifiant : moiPour configurer votre mot de passe, rendez-vous à l’adresse suivante :
<http://localhost/demo/coucou?action=rp&key=4yKMFJAtA9y5s9JgghyD&login=moi>
http://localhost/demo/coucou
[20-Mar-2016 09:30:42 UTC] ================ Fin Mail =======================
Retourner un statut choisi après « émission » du courriel
L’objectif étant de disposer d’un outil de développement, nous avons besoin de tester les cas d’émission réussie comme les cas d’émission ayant échouée. Par exemple, la procédure d’envoi de courriel pour modification du mot de passe affiche le message suivant s’il détecte que l’envoi a échoué :

Le programme standard d’émission de courriel de WordPress ne propose pas de crochet permettant de modifier le statut après la tentative d’émission :

Heureusement, la fonction wp_mail() est une fonction redéfinissable (pluggable) c’est à dire qu’on peut réaliser sa propre version qui sera exécutée à la place de la fonction standard.
Les fonctions redéfinissables se trouvent dans le fichier : « wp-includes\pluggable.php ». Elles commencent par un test d’existence :
if ( !function_exists( ‘wp_mail’ ) ) :
Nous recopions la totalité de la fonction « wp_mail() » dans le fichier de l’extension, nous la renommons en « wpdf_wp_mail() » et nous créons une nouvelle fonction « wp_mail » :
function wp_mail( $wpdf_to, $wpdf_subject, $wpdf_message, $wpdf_headers = '', $wpdf_attachments = array() ) { $wpdf_retour = wpdf_wp_mail( $wpdf_to, $wpdf_subject, $wpdf_message, $wpdf_headers = '', $wpdf_attachments = array() ); // choisir son statut de retour return $wpdf_retour; //return true; //return false; } // fin fonction wp_mail redéfinie
Cette nouvelle fonction « wp_mail » réalise deux choses :
- appeler la fonction « wpdf_wp_mail() » qui est le clone de la fonction « wp_mail() » standard de WordPress,
- renvoyer la valeur de retour réelle ou choisie :
- la valeur retournée par la fonction qui a envoyé le mail : « wpdf_wp_mail() »,
- « true » : comme si l’émission s’était passée correctement,
- « false » : comme si l’émission n’avait pu être réalisée.
La valeur retournée est la première qui n’est pas indiquée comme étant un commentaire, c’est à dire celle qui ne commence pas par deux barres verticales (« // »).
Remarques sur l’utilisation des fonctions redéfinissables
Nous aurions pu totalement redéfinir la fonction « wp_mail() », par exemple en recopiant simplement dans le fichier journal ses paramètres : $to, $subject, $message, $headers, $attachments.
Ceci fonctionne correctement, mais ne permet pas de tester en profondeur l’émission de courriels :
- les vérifications effectuées dans « wp_mail() » ne sont pas réalisées (exemple : vérifier qu’une adresse mail soit correcte),
- les valeurs par défaut ne sont pas gérées (exemple : l’émetteur par défaut est « wordpress@nom_de_domaine_du site »),
- les crochets ne son t pas pris en compte (exemple : le filtre « wp_mail_from » permet de modifier l’adresse mail de l’expéditeur).
Les fonctions redéfinissables permettent de remplacer certaines fonctions fournies par WordPress. Il faut simplement se souvenir qu’il convient de remplacer non seulement le principal fonctionnement mais aussi tout ce qui enrichit la fonction : vérifications, valeurs par défaut et crochets.
Haut de pageLe code de l’extension
On trouve dans l’article Modifier l’accès à wp-login.php la façon de récupérer le code pour ajouter l’extension sur son site .
Haut de page