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.
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.
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.
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.
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é.
/**
* 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 :
$envoi_reussi = wp_mail( "destinataire@sondomaine.com", "Sujet", "Message" );
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().
$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( ''', "'", $sujet); // sinon les apostrophes n'apparaissent pas bien dans le sujet
$sujet = str_replace( '"', '"', $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 );
Il y a deux principaux scénarios d'envoi de courriel par programmation :
Le problème dans le cas du formulaire de contact, c'est que lorsque l'administrateur voudra répondre au courriel, le bouton 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).
$headers[] = "Reply-To: <$courriel_de_l_internaute>";
$envoi_reussi = wp_mail( "un_administrateur@sondomaine.com", $sujet, $message, $headers );
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.
/**
* 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.
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, 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.
/**
* 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.
Array
(
[0] => You must provide at least one recipient email address.
)
« PHPMailer SMTP Error: Could not connect to SMTP host ». Netcore. https://netcorecloud.com/tutorials/phpmailer-smtp-error-could-not-connect-to-smtp-host/
▼Publicité