Pourquoi le protocole SMTP pour envoyer des emails ?

Utiliser le protocole SMTP pour envoyer des emails transactionnels dans vos projets PHP a plusieurs avantages. Le premier est de passer par une connexion sécurisée pour l’envoi du message. La fonction mail native de PHP n’utilise pas de protocole sécurisé donc les messages peuvent être interceptés sur le réseau. Second avantage, si on est développeur web sur macOS il est difficile d’envoyer un email PHP localement en PHP ainsi avec la librairie PHPMailer et un email on peut concevoir des applications web plus facilement.

La librairie PHPMailer est l’une des plus utilisées dans les applications PHP. Initialement créée en 2001 par Brent Matzelle, cette bibliothèque s’est beaucoup développée par la communauté PHP. Elle est présente dans de nombreux projets open source comme WordPress, Drupal et de nombreuses autres solutions. En tant que développeur web il est difficile de ne pas utiliser cette librairie au lieu de la fonction native de PHP.

PHPMailer facilite l'envoi des emails transactionnels dans une application PHP
PHPMailer facilite l’envoi des emails transactionnels dans une application PHP

Configurer PHPMailer pour utiliser le protocole SMTP

Pour cet exemple il faut une adresse email chez OVH ou un autre fournisseur. Attention quelques FAI bloquent les envois SMTP sur certains serveurs pour éviter les spams. Une fois PHPMailer intégré au projet, nous reprendrons le code d’exemple de la documentation. Dans un premier temps on importe la librairie PHPMailer avec la classe SMTP :

<?php
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

require 'PHPMailer-6.6.0/src/Exception.php';
require 'PHPMailer-6.6.0/src/PHPMailer.php';
require 'PHPMailer-6.6.0/src/SMTP.php';

$mail = new PHPMailer(true);

Ensuite on va créer une simple fonction d’envoi d’email avec la configuration adéquate pour utiliser le protocole SMTP avec une connexion chiffrée. Il est nécessaire d’appeler la méthode isSMTP afin d’initialiser l’utilisation de ce protocole. Si on ne le fait pas cela appellera la fonction native mail du PHP. Pour rappel chez OVH le nom du serveur est ssl0.ovh.net, le port 465 et le chiffrement SSL/TLS.

try {

    // Config
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;
    $mail->isSMTP();
    $mail->Host       = 'ssl0.ovh.net';
    $mail->SMTPAuth   = true;
    $mail->Username   = 'contact@jagullo.fr';
    $mail->Password   = '*******';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    $mail->Port       = 465;

    // Header
    $mail->setFrom('contact@jagullo.fr');
    $mail->addAddress('test@jagullo.fr');
    $mail->addReplyTo('contact@jagullo.fr');

    // Content
    $mail->isHTML(true);
    $mail->Subject = 'Here is an email test';
    $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    // Send
    $mail->send();
    echo 'Message has been sent';

} catch (Exception $e) {

    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";

}

Dans la variable Username on indique son adresse email et dans la variable Password son mot de passe. Pour définir le bon chiffrement, il faut appeler la variable SMTPSecure qui nécessite une constante de PHPMailer ENCRYPTION_SMTPS. Si on doit utiliser du STARTTLS on peut définir la constante ENCRYPTION_STARTTLS.

Plus de sécurité avec le protocole OAuth

On pourrait utiliser Gmail comme serveur SMTP mais Google arrête l’accès aux applications moins sécurisées et demande d’utiliser le protocole OAuth (Open Authorization). C’est un protocole libre pour sécuriser les authentifications à des services et des API en se basant sur un système de token. Dans sa version 6.6, PHPMailer facilite l’intégration de OAuth pour envoyer des emails avec plus de sécurité. Il existe de nombreuses ressources sur Internet qui traite de ce point et qui peut aussi faire l’objet d’un prochain tutoriel.

Alternative à PHPMailer

Il existe plusieurs alternatives à cette bibliothèque dans différents langages. En PHP il y a Symfony’s Mailer qui est la librairie par défaut du framework Symfony mais qui peut être utilisée indépendamment. Sur le serveur NodeJS il y a Nodemailer qui est une librairie open source pour envoyer des emails en pur JavaScript. Il existe aussi Emailjs en JavaScript qui implémente seulement le protocole SMTP. Ces librairies peuvent se coupler avec un service d’email transactionnel comme Sendinblue ou MailerSend. Un service d’email transactionnel permet d’avoir une meilleure délivrabilité et plus de sécurité pour envoyer les emails de son application.