picture picture
décembre 20, 2019 PHP 15 Commentaires

[Tuto] Envoyer un mail avec PHPMailer

L'une des meilleures solutions pour envoyer des e-mails en PHP consiste à passer par l'excellente librairie gratuite PHPmailer. Petit tutoriel simple !

En PHP, la fonction mail() suffit souvent pour envoyer des e-mails simples (format texte, pas de pièces jointes…)

La situation se corse lorsqu’il faut envoyer des pièces jointes, afficher des données en HTML sur tous les clients mails sans erreurs d’en-codage (vive les iPhone :( !), ou encore ne pas être tout simplement rejetés d’office le FAI dans la boîte de spam de votre destinataires…

L’une des meilleures solutions consiste à passer par l’excellente librairie gratuite PHPmailer qui fait tout cela très bien… et simplement.

1ère étape : installer la librairie PHPMailer

Connectez vous au site de PHPMailer, et téléchargez la dernière version en cliquant sur le bouton vert « Download » > « Download ZIP »

Après extraction des fichiers, déposez les sur votre serveur dans un dossier intitulé par exemple « PHPMailer » (j’ai juste renommé dans mon exemple le dossier « PHPMailer-master » dézippé)

Étape 2 : connecter votre fichier PHP à la classe PHPMailer

Dans le fichier PHP d’envoi de vos e-mails, insérer le code suivant (en personnalisant le chemin du dossier PHPMailer) :

// lance les classes de PHPMailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
// path du dossier PHPMailer % fichier d'envoi du mail
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
									

Étape 3 : créer une fonction d’envoi des e-mails depuis votre serveur SMTP

Dans cet exemple j’ai nommé cette fonction sendmail().

Pour cette étape vous devez connaître les caractéristiques de votre serveur SMTP (demandez les à votre hébergeur le cas échéant)
Vous pouvez aussi utiliser le serveur SMTP de Gmail ou de votre FAI, avec tout de même un risque accru de mise en spam par la boîte e-mail de votre destinataire…
Personnellement j’aime bien créer une boîte e-mail spécifique sur le même domaine que l’application des envois, du type <ne-pas-repondre@mon_domaine.com>

Les différentes options sont commentées dans le code ci-dessous :

function sendmail($objet, $contenu, $destinataire) {  
// on crée une nouvelle instance de la classe
$mail = new PHPMailer(true);
  // puis on l’exécute avec un 'try/catch' qui teste les erreurs d'envoi
  try {
    /* DONNEES SERVEUR */
    #####################
    $mail->setLanguage('fr', '../PHPMailer/language/');   // pour avoir les messages d'erreur en FR
    $mail->SMTPDebug = 0;            // en production (sinon "2")
    // $mail->SMTPDebug = 2;            // décommenter en mode débug
    $mail->isSMTP();                                                            // envoi avec le SMTP du serveur
    $mail->Host       = 'smtp du serveur';                            // serveur SMTP
    $mail->SMTPAuth   = true;                                            // le serveur SMTP nécessite une authentification ("false" sinon)
    $mail->Username   = 'ne-pas-repondre@mon_domaine.fr';     // login SMTP
    $mail->Password   = '**********';                                                // Mot de passe SMTP
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;     // encodage des données TLS (ou juste 'tls') > "Aucun chiffrement des données"; sinon PHPMailer::ENCRYPTION_SMTPS (ou juste 'ssl')
    $mail->Port       = 587;                                                               // port TCP (ou 25, ou 465...)

    /* DONNEES DESTINATAIRES */
    ##########################
    $mail->setFrom('ne-pas-repondre@mon_domaine.fr', 'No-Reply');  //adresse de l'expéditeur (pas d'accents)
    $mail->addAddress($destinataire, 'Clients de Mon_Domaine');        // Adresse du destinataire (le nom est facultatif)
    // $mail->addReplyTo('moi@mon_domaine.fr', 'son nom');     // réponse à un autre que l'expéditeur (le nom est facultatif)
    // $mail->addCC('cc@example.com');            // Cc (copie) : autant d'adresse que souhaité = Cc (le nom est facultatif)
    // $mail->addBCC('bcc@example.com');          // Cci (Copie cachée) :  : autant d'adresse que souhaité = Cci (le nom est facultatif)

    /* PIECES JOINTES */
    ##########################
    // $mail->addAttachment('../dossier/fichier.zip');         // Pièces jointes en gardant le nom du fichier sur le serveur
    // $mail->addAttachment('../dossier/fichier.zip', 'nouveau_nom.zip');    // Ou : pièce jointe + nouveau nom

    /* CONTENU DE L'EMAIL*/
    ##########################
    $mail->isHTML(true);                                      // email au format HTML
    $mail->Subject = utf8_decode($objet);      // Objet du message (éviter les accents là, sauf si utf8_encode)
    $mail->Body    = $contenu;          // corps du message en HTML - Mettre des slashes si apostrophes
    $mail->AltBody = 'Contenu au format texte pour les clients e-mails qiui ne le supportent pas'; // ajout facultatif de texte sans balises HTML (format texte)

    $mail->send();
    echo 'Message envoyé.';
  
  }
  // si le try ne marche pas > exception ici
  catch (Exception $e) {
    echo "Le Message n'a pas été envoyé. Mailer Error: {$mail->ErrorInfo}"; // Affiche l'erreur concernée le cas échéant
  }  
} // fin de la fonction sendmail
									

A titre d’exemple voici la fonction en production avec des SMTP de Google (sans double authentification) si vous n’avez pas les identifiants d’un serveur propre :

    $mail -> SMTPDebug  =  0 ;    
    $mail -> isSMTP();
    // $mail->isSendmail();    // décommenter en mode debug avec le SMTP de Gmail (remplace la ligne précédente)
    $mail->Host = "smtp.gmail.com";
    $mail->Port = 465;
    $mail->SMTPSecure = 'tls';   
    $mail->SMTPAuth = true;
    $mail->Username = "************@gmail.com";    //Votre mail
    $mail->Password = "*****";                                    //Votre mot de passe 
    $mail->setFrom('************@gmail.com');           //Votre mail
									

Étape 4 : activer la fonction sendmail()

On renseigne les variables « destinataire », « contenu » et « objet », puis on exécute la fonction :

  $dest = "contact@destinataire.fr";
  $objet = "[Association] Nouveau message de moi ";
  $contenu = "<br />'hello world'";
  $contenu .= "<br /><br />Date du message : ".date("d/m/Y");

sendmail($objet, $contenu, $dest);
									

Étape 5 : pièces jointes avec PHPMailer

L’utilisation de PHPMailer pour envoyer des pièces jointes est déconcertant de facilité…
Le fichier à envoyer est supposé présent sur votre serveur dans un dossier « **/fic/ » dans cet exemple.
– Il faut d’abord rajouter la ligne suivante dans la fonction sendmail($objet, $message, $destinataire, $piece_jointe) : notez l’ajout d’un 4eme paramètre « $pièce jointe » dans la fonction

$mail->addAttachment('../fic/'.$piece_jointe);         // Pièces jointes en gardant le nom du serveur
// $mail->addAttachment('../fic/'.$piece_jointe, 'new.jpg');      // Pièce jointe avec un nouveau nom
									

– Puis on renseigne les variables « destinataire », « contenu », « objet » et « piece jointe », et on exécute la fonction comme précédemment (mais avec 4 paramètres) :

  $dest = "contact@destinataire.fr";
  $objet = "[Association] Nouveau message de moi avec PJ ";
  $contenu = "<br />'hello world'";
  $contenu .= "<br /><br />Date du message : ".date("d/m/Y");
        $pj = "photodemoi.jpg";

sendmail($objet, $contenu, $dest, $pj);
									

NB : pour les utilisateurs de PHP 5.6…

eh oui… ça existe encore ;)
Ajoutez la ligne suivante au début de la fonction sendmail() :

$mail->SMTPOptions = array('ssl' => 
   array(
      'verify_peer' => false,
      'verify_peer_name' => false,
      'allow_self_signed' => true));
									

Voilà : c’est tout ! Have fun :)

15 Responses to “[Tuto] Envoyer un mail avec PHPMailer”

15 Commentaires

  1. webtolosa dit :

    Je ne sais pas si ça peut t’aider ? J’ai trouvé ça : https://faq.herculepro.com/index.php/parametrage-du-smtp-ovh/

  2. jamila dit :

    Bonjour, merci pour ce tutoriel… en fait j ai un hébergement avec ovh et je ne parviens pas a trouver les codes smtp. je les ai appelé et m ont dit qu il fallait faire sans smtp mais je ne trouve aucunes ressources sur le sujet …

  3. webtolosa dit :

    @François,
    il suffit de « copier-coller » le code de l’étape 4 (en renseignant vos variables). C’est tout ! Quand la page sera ouverte par un internaute, la fonction se lance automatiquement, c’est ce qu’on appelle « l’activer »

  4. François dit :

    Merci Webtolosa

    Merci pour ce tuto qu’un débutant « copieur / colleur » a finalement compris :)

    F

  5. François dit :

    Bonjour Web Tolosa

    J’apprécie la simplicité de votre tuto, autant sur le fond que sur la forme, loin des « je me la pète ».

    Cela dit, et considérant mon niveau « bille », j’ai peine à comprendre l’étape 4 : activer la fonction sendmail().

    Je ne sais pas ou l’insérer. J’ai essayé et cherché un peu partout, mais je me suis perdu.

    Auriez vous la bonté de me venir en aide ?

    D’avance, et quoi qu’il en soit : merci :)

  6. Fred dit :

    Merci beaucoup pour ce tuto fonctionnel, clair, net, précis et pro
    A+

  7. webtolosa dit :

    Bonjour Tartopum,
    c’est normal, il faut que le lien de ton image soit un lien absolu (qui pointe vers une image déposée sur un serveur sur internet, avec un code du type :
    < img src="https://monsite.com/image/monimage.jpg" />
    Sinon ton destinataire ne verra pas l’image qui est restée chez toi (lien relatif qui n’affiche l’image que depuis une page HTML sur ton ordinateur)

  8. Tartopum dit :

    Bonjour et mille mercis spour ce tuto super bien fichu.

    Dans le contenu du e mon mial, je voudrais afficher une image, j’ai donc mis :

    bla bla bla
    Cordialement,
    Monsieur XXX

    Mon mail part bien mais l’image ne s’affiche pas , or si j’ouvre une page html avec ce code, ca marche bien.

    Any idée ?

  9. webtolosa dit :

    C’est de la gestion de base des variables dynamiques > https://www.php.net/manual/fr/book.var.php

  10. Bonjour,
    Je n’arrive pas à comprendre comment faire pour ‘personnaliser’ un mail que l’on envoie à X personnes (sélectionnées à partir d’une requête) pour que chaque destinataire reçoive son mail avec des infos qui lui sont propres (Bonjour …., Vous êtes bien né le ….. , vous habitez toujours au …)
    Je ne saisi pas comment construire l’attachement du texte ‘personnalisé’.

    Merci de votre aide ou d’un tuto simple.
    Cordialement.
    Michel

  11. richard dit :

    Bonjour,

    un grand merci pour ce tuto. j’ai repris un code fait par qq un d’autre et la version était dépassée. alors, j’ai cherché un peu et miracle ;-) un petit tuto en français, ça change ;-) et pour le coup bien commenté.

  12. webtolosa dit :

    @SH : Tu as raison, merci !

  13. SH dit :

    Bonjour,

    Merci pour ce tuto.
    Je suis en train de regarder ton programme mais je note une petite erreur, sauf erreur de ma part, dans ta fonction sendMail().

    En effet, la ligne
    $mail->addAddress($dest, ‘Clients de Mon_Domaine’);
    ne serait-ce pas plutôt
    $mail->addAddress($destinataire, ‘Clients de Mon_Domaine’);

    Bien cordialement,

  14. webtolosa dit :

    Bonjour Daniel (pas si brelle que çà ;)) !
    C’est le plugin d’affichage du code qui m’a joué ce tour : en effet ce n’est pas un slash, mais un anti-slash qu’il faut utiliser à ce niveau.
    Merci beaucoup de cette remarque : c’est corrigé !

  15. Daniel dit :

    Bonjour,

    Tout d’abord merci pour ce tuto.
    C’est bien pratique pour les vieux retraité comme moi qui ne comprennent pas tout aux différents langages.
    Sinon, je voulais signaler une petite erreur dans les « use » de l’étape 2, il manque aussi les /entre les PHPMailer.
    C’est juste pour éviter aux brelles comme moi de galérer plus que nécessaire ;-)
    Au revoir et encore merci pour ce très bon tuto.
    Daniel

Commentaire

Name

Mail (ne sera pas publié)

Website

Laisser ces deux champs tels quels :
:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: