Introduction à PhpMailer avec PHP

L'envoi d'email en PHP se fait traditionnellement par la fonction mail(). En pratique, l'usage de cette fonction cause plusieurs problèmes : la première étant qu'il n'est pas possible de s'identifier au prêt d'un serveur SMTP. L'envoi s'effectuant de manière anonyme, et le mail arrivant très souvent dans les spams.

Pour cette raison une bibliothèque open source existe PHPMailer. Elle permet de simplifier l'ensembles des interactions avec un serveur SMTP.

Déployer PhpMailer sur un projet Php

Pour intégrer PhpMailer à un projet, il faut suivre les étapes suivantes :

  1. Télécharger la source de PHPMailer
  2. Déziper l'archive de PHPMailer 
  3. Copier le dossier dans l'arborescence de votre projet à l'emplacement de votre choix
  4. Inclure dans le code PHP les dépendances minimales pour pouvoir envoyer un email avec PHPMailer 
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

Le fonctionnement général pour envoyer un email en PHP avec PHPMailer

  1. Initialisation de l'objet PHPMailer.
  2. Paramétrage pour la communication avec le serveur SMTP.
  3. Définition de l'encodage.
  4. Désigner l'email de l'expéditeur et son alias.
  5. Création de l'email (objets, contenu HTML, variante de contenu texte).
  6. Ajout du ou des destinataires (avec ou sans alias).
  7. Ajout des destinataires CCI (copie conforme invisible).
  8. Envoye de l'email au serveur SMTP pour distribution.

Paramétrage du serveur SMTP avec PHPMailer

L'initialisation de l'objet s'effectue via l'appel du constructeur de l'objet PHPMailer. On assigne alors le serveur SMTP à utiliser via la propriété Host. Puis on définit le port TCP à utiliser pour communiquer avec le serveur SMTP grâce à la propriété Port. Enfin on force la prioriété SMTPAuth à 1 pour utiliser l'authentification lors de l'envoi de l'email au serveur SMTP. Dans l'exemple suivant nous immiterons une connexion sur un serveur SMTP d'OVH :

$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = 'ssl0.ovh.net';               //Adresse IP ou DNS du serveur SMTP
$mail->Port = 465;                          //Port TCP du serveur SMTP
$mail->SMTPAuth = 1;                        //Utiliser l'identification

if($mail->SMTPAuth){
   $mail->SMTPSecure = 'ssl';               //Protocole de sécurisation des échanges avec le SMTP
   $mail->Username   =  'login@ovh.net';   //Adresse email à utiliser
   $mail->Password   =  'password';         //Mot de passe de l'adresse email à utiliser
}

Définir l'encodage

Pour définir l'encodage de l'email pour garantir une lisibilité optimum pour les destinataires il suffit d'assigner la proprieté CharSet avec le jeu d'encodage souhaité (ici UTF-8).

$mail->CharSet = 'UTF-8'; //Format d'encodage à utiliser pour les caractères

Tenter d'établir la connexion au serveur SMTP :

Une fois les informations d'identifications saisies, la méthode smtpConnect() permet de tester la connexion au serveur SMTP. Cette étape est optionnelle.

$mail->smtpConnect();

Désigner l'email et l'alias de l'expéditeur

La proprieté From est obligatoire et permet de définir quel adresse email servira de référence en qualité d'expéditeur pour répondre à l'email (peut être différente de l'adresse utilisée pour l'authentification SMTP). La propriété FromName est quand à elle optionnelle et sert uniquement pour définir l'alias (le nom d'usage).

$mail->From       =  'contact@ovh.net';                //L'email à afficher pour l'envoi
$mail->FromName   = 'Contact de ovh.net';             //L'alias à afficher pour l'envoi

Création de l'email, objet, contenu Texte et contenu HTML

 La prorpriété Subject permet de définir le sujet de l'email. La propriété MsgHTML désigne le fragment de HTML servant de contenu par défaut. La propriété AltBody sert à désigner quel contenu alternatif en texte brut sera utilisé dans le client de messagerie du destinataire.

$mail->Subject    =  'Mon sujet';                      //Le sujet du mail
$mail->WordWrap   = 50; 			                   //Nombre de caracteres pour le retour a la ligne automatique
$mail->AltBody = 'Mon message en texte brut'; 	       //Texte brut
$mail->IsHTML(false);                                  //Préciser qu'il faut utiliser le texte brut

if($Use_HTML == true){
   $mail->MsgHTML('<div>Mon message en <code>HTML</code></div>'); 		                //Le contenu au format HTML
   $mail->IsHTML(true);
}

Ajouter un (ou plusieurs) destinataires (sans alias)

La fonction AddAddress permet de définir un déstinaire à qui remettre l'email.

$list_emails_to = array('johndoe@ovh.net','maxlamenace@ovh.net');
foreach ($list_emails_to  as $key => $email) {
  $mail->AddAddress($email);
}

Ajouter un destinataire (avec un alias)

$mail->AddAddress('johndoe@ovh.net','John Doe');

Ajouter un utilisateur en CCI/BBC (Copie conforme invisible)

$mail->addBCC('hollow_man@ovh.net','Sebastian Caine');

Ajouter une pièce jointe

Il est aisé d'ajouter une pièce jointe à un email via la méthode AddAttachment() cette méthode prend deux paramètres l'emplacement du fichier sur le serveur, et le nom du fichier qui sera affiché chez le destinataire de l'email.

$mail->AddAttachment('./doc/content/rapport.pdf','Rapport_2018.pdf');  

Envoyer l'email

Pour envoyer l'email via PHPMailer, rien de plus simple, il suffit d'utiliser la méthode Send().

$mail->Send();

En conclusion, vous savez maintenant utiliser les fondamentaux de la librairie PHPMailer pour envoyer des emails en PHP via un serveur SMTP.