Formation PUB020 : WordPress, 2023 L'envoi de courriel

34.1 Envoyer du courriel par programmation dans WordPress


La plupart des sites WordPress auront besoin tôt ou tard d'envoyer du courriel par programmation, que ce soit pour qu'un internaute puisse communiquer avec un des responsables du site à partir d'un formulaire Web ou encore pour que les responsables du site envoient des notifications ou des informations à des internautes.

À partir de quelle adresse de courriel est-ce que le site peut faire l'envoi?

Si un site Web tente d'envoyer un courriel à partir d'une adresse dont le nom de domaine est différent du sien, l'opération risque de ne pas fonctionner. Dans le meilleur des cas, le courriel tombera systématiquement dans la boîte de pourriels. Ouch!

Ainsi, un site dont l'adresse est https://mondomaine.com devra utiliser un courriel du genre monnom@mondomaine.com.

Souvent, les sites utiliseront une adresse de courriel du genre no-reply@mondomaine.com pour envoyer les courriels pour lesquels ils ne souhaitent pas avoir à traiter les réponses à ce courriel.

Extensions pour configurer le courriel

Sous WordPress, plusieurs extensions permettent de configurer l'envoi de courriel SMTP, par exemple :

Il est également possible d'envoyer du courriel sans utiliser une extension. C'est ce que je vais vous démontrer dans les sections qui suivent.

Envoyer du courriel sans extension

Le noyau WordPress permet d'envoyer du courriel sans avoir recours à une extension. Il utilise pour celà la classe PHPMailer, une bibliothèque très réputée dans le monde PHP.

Il vous reste à configurer l'objet que WordPress a instancié afin qu'il utilise le serveur de courriel que nous avons choisi pour effectuer l'envoi.

Pour configurer l'objet, il est d'usage de définir des constantes dans le fichier wp-config.php afin de protéger les informations sur votre compte de courriel.

Fichier wp-config.php

define( 'SMTP_HOST', 'mail.mondomaine.com' );
define( 'SMTP_AUTH', true );
define( 'SMTP_PORT', '587' );  // ou 465
define( 'SMTP_SECURE', 'tls' );   // ou ssl
define( 'SMTP_USERNAME', 'moncourriel@mondomaine.com' );
define( 'SMTP_PASSWORD', 'mot-de-passe-en-clair' );
define( 'SMTP_FROM', 'moncourriel@mondomaine.com' ); 
define( 'SMTP_FROMNAME', 'Mon site Web' );

Ces constantes seront utilisées pour initialiser l'objet $phpmailer que le noyau WordPress a instancié.

Fichier functions.php

/**
 * Configurer l'envoi de courriel par SMTP.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * Utilisation : add_action( 'phpmailer_init', 'monprefixe_configurer_courriel' );
 * L'envoi de courriel ser fera comme suit :
 * wp_mail( "destinataire@sondomaine.com", "Sujet", "Message" );
 */
function monprefixe_configurer_courriel( $phpmailer ) {
    $phpmailer->isSMTP();
    $phpmailer->Host = SMTP_HOST;
    $phpmailer->SMTPAuth = SMTP_AUTH;
    $phpmailer->Port = SMTP_PORT;
    $phpmailer->SMTPSecure = SMTP_SECURE;
    $phpmailer->Username = SMTP_USERNAME;
    $phpmailer->Password = SMTP_PASSWORD;
    $phpmailer->From = SMTP_FROM;
    $phpmailer->FromName = SMTP_FROMNAME;
}

add_action( 'phpmailer_init', 'monprefixe_configurer_courriel' );

Pour envoyer un courriel, le code devra faire ceci :

WordPress (PHP)

$envoi_reussi = wp_mail( "destinataire@sondomaine.com", "Sujet", "Message" );

Encodage des accents et sauts de ligne

Si vous souhaitez que le message puisse contenir des sauts de ligne, il faudra utiliser l'encodage iso-8859-1.

Ceci aura cependant un effet sur l'encodage des caractères accentués. Il faudra donc les convertir de utf-8 vers iso-8859-1 à l'aide de la fonction mp_convert_encoding().

WordPress (PHP)

$sujet = "C'est beau l'été!";
$message = "Première ligne<br />Deuxième ligne";
$headers[] = "Content-type: text/html; charset=ISO-8859-1";   // charset requis pour ajouter des sauts de ligne

$sujet = mb_convert_encoding( $sujet, 'ISO-8859-1', 'UTF-8' ); // sinon les caractères ne sont pas correctement encodés puisque l'envoi se fait en ISO-8859-1 pour assurer l'envoi des sauts de ligne
$sujet = str_replace( '&#039;', "'", $sujet); // sinon les apostrophes n'apparaissent pas bien dans le sujet
$sujet = str_replace( '&quot;', '"', $sujet); // sinon les guillemets n'apparaissent pas bien dans le sujet

$message = mb_convert_encoding( $message, 'ISO-8859-1', 'UTF-8' );

$envoi_reussi = wp_mail( "destinataire@sondomaine.com", $sujet, $message, $headers );

Cas du formulaire de contact

Il y a deux principaux scénarios d'envoi de courriel par programmation :

  • Le site souhaite envoyer un courriel à un internaute pour l'informer de quelque chose.
  • L'internaute a utilisé le formulaire de contact du site pour rejoindre un administrateur.

Le problème dans le cas du formulaire de contact, c'est que lorsque l'administrateur voudra répondre au courriel, le bouton Répondre enverra le message à l'adresse de courriel configurée dans SMTP_FROM.

Le bon comportement serait cependant d'envoyer le courriel à l'internaute qui a rempli le formulaire.

Pour régler ce problème, il faut travailler avec une adresse de réponse (Reply to).

WordPress (PHP)

$headers[] = "Reply-To: <$courriel_de_l_internaute>";
$envoi_reussi = wp_mail( "un_administrateur@sondomaine.com", $sujet, $message, $headers );

Outils de débogage

Si vous désirez un outil pour vous aider à déboguer les problèmes d'envoi, il est possible d'écrire une fonction de rappel pour le hook wp_mail_failed.

WordPress (PHP)

/**
 * Logue les erreurs en cas de problème si WP_DEBUG est à true.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * Utilisation : add_action('wp_mail_failed', 'monprefixe_erreur_courriel', 10, 1);
 * Ceci appellera automatiquement cette fonction en cas d'erreur après avoir fait
 * wp_mail( "destinataire@sondomaine.com", "Sujet", "Message" );
 */
function monprefixe_erreur_courriel( $wp_error ) {
   monprefixe_log_debug( $wp_error );
}

add_action( 'wp_mail_failed', 'monprefixe_erreur_courriel', 10, 1 );

En cas d'erreur, on retrouvera quelque chose du genre dans le fichier debug.log.

Fichier debug.log

WP_Error Object
    (
        [errors] => Array
            (
                [wp_mail_failed] => Array
                    (
                        [0] => You must provide at least one recipient email address.
                    )

            )

        [error_data] => Array
            (
                [wp_mail_failed] => Array
                    (
                        [to] => Array
                            (
                                [0] =>
                            )

                        [subject] => Bonjour!
                        [message] => Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                        [headers] => Array
                            (
                            )

                        [attachments] => Array
                            (
                            )

                        [phpmailer_exception_code] => 2
                    )

            )

        [additional_data:protected] => Array
            (
            )

    )

Avant WordPress 4.4.0

Avant WordPress 4.4.0, sorti en décembre 2015, le débogage de l'envoi de courriel était plus complexe.

Il fallait englober l'appel à wp_mail() dans une fonction qui se chargeait d'inscrire les erreurs dans le fichier debug.log.

WordPress (PHP)

/**
 * Envoie un courriel par SMTP et logue les erreurs en cas de problème si WP_DEBUG est à true.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 * Inspiré de https://www.bobz.co/debug-wp_mail-function
 *
 * Note : depuis WordPress 4.4.0, on préférera travailler avec le hook wp_mail_failed.
 *
 * Utilisation : monprefixe_envoyer_courriel( "destinataire@sondomaine.com", "Sujet", "Message" );
 */
function monprefixe_envoyer_courriel( $courriel, $sujet, $message ) {
    // envoie le courriel
    $envoi_reussi = wp_mail( $courriel, $sujet, $message );

    // réagit si n'a pas fonctionné
    if (!$envoi_reussi && WP_DEBUG == true) {
        global $ts_mail_errors, $phpmailer;

        if ( ! isset($ts_mail_errors) ) {
            $ts_mail_errors = array();
        }

        if ( isset($phpmailer) ) {
            $ts_mail_errors[] = $phpmailer->ErrorInfo;
        }

        monprefixe_log_debug($ts_mail_errors);
    }

    return $envoi_reussi;
}

En cas d'erreur, on pouvait retrouver quelque chose du genre dans le fichier debug.log.

Fichier debug.log

Array
(
    [0] => You must provide at least one recipient email address.
)

Pour plus d'information

« PHPMailer SMTP Error: Could not connect to SMTP host ». Netcore. https://netcorecloud.com/tutorials/phpmailer-smtp-error-could-not-connect-to-smtp-host/

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre