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.

Comment déployer PhpMailer sur un projet en PHP ?

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

  1. Télécharger la source de PHPMailer
  2. Décompresser 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.

Comment paramétrer le serveur SMTP avec PHPMailer en PHP ?

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
}

Comment définir l'encodage avec PhpMailer ?

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

Comment tenter d'établir la connexion au serveur SMTP avec PhpMailer ?

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();

Comment définir 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

Comment créer 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);
}

PHP et MySQL
Vous souhaitez monter en compétence facilement et rapidement ?

Comment 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);
}

Comment ajouter un destinataire (avec un alias) ?

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

Comment ajouter un utilisateur en CCI/BBC (Copie conforme invisible) ?

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

Comment ajouter une pièce jointe avec PhpMailer ?

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');  

Comment envoyer l'email grâce à PHPMailer avec PHP ?

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

if (!$mail->send()) {
      echo $mail->ErrorInfo;
} else{
      echo 'Message bien envoyé';
}

Comment envoyer un email avec PHPMailer depuis un formulaire HTML ?

Supposons deux fichiers form_email.html et send_email.php en racine de notre serveur ainsi que le dossier PHPMailer qui contient les sources de la librairie de PHPMailer :

form_email.html qui contient le code html suivant :

<form method="post" action="send_email.php"> 
 	<input type="email" name="email_to" maxlength="255" placeholder="Email du destinataire"/>
	<input type="email" name="email_from" maxlength="255" placeholder="Email de l'emetteur" />
	<input type="text" name="email_from_alias" maxlength="255" placeholder="Alias de l'email de l'emetteur" />
	<input type="text" name="object" maxlength="255" placeholder="Objet de l'email" />
    <textarea name="body">
		
	</textarea>
	<input type="submit" value="Submit"/>
</form>

Et send_email.php qui contient le code PHP suivant qui sert à instancier l'envoi des données du formulaire au serveur SMTP pour arriver dans la boite email de votre destinataire.

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

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

$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
$mail->CharSet = 'UTF-8';

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
}

$mail->From       = trim($_POST["email_from"]);                //L'email à afficher pour l'envoi
$mail->FromName   = trim($_POST["email_from_alias"]);          //L'alias de l'email de l'emetteur

$mail->AddAddress(trim($_POST["email_to"]));

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

if (!$mail->send()) {
      echo $mail->ErrorInfo;
} else{
      echo 'Message bien envoyé';
}

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