Créer des sites Web dynamiques en PHP (PHP Hypertext Preprocessor)

Auteur: Mohamed CHINY Durée necessaire pour le cours de Créer des sites Web dynamiques en PHP (PHP Hypertext Preprocessor) Niveau recommandé pour le cours de Créer des sites Web dynamiques en PHP (PHP Hypertext Preprocessor) Supports vidéo disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz disponible pour ce cours

Page 21: Envoyer des mails en PHP

Toutes les pages

Fonction mail

Il vous est certainement déjà arrivé de vous inscrire sur un forum ou un réseau social, et juste après que vous ayez fini votre inscription, vous recevez un mail de bienvenue. Bien entendu ce mail n'a pas été envoyé par une personne mais par le serveur, et d'une manière automatisée.

En PHP il est possible d'envoyer un mail via un script, c'est grâce à la fonction mail(). La syntaxe de la fonction mail ressemble à ceci:
mail($dest , $objet , $message , $entetes);
  • Paramètre $dest:

  • Le paramètre $dest spécifie l'adresse du destinataire. Son format est standard et peut être représenté comme ceci:
    • user@domaine.tld
    • Nom Prénom <user@domaine.tld>
    • user1@domaine1.tld1, user2@domaine2.tld2 ... (plusieurs destinataires à la fois)
    • Nom1 Prénom1 <user1@domaine1.tld1>, Nom2 Prénom2 <user2@domaine2.tld2> ... (plusieurs destinataires à la fois)


  • Paramètre $objet:

  • Le paramètre $objet décrit l'objet du message. Il peut être laissé vide.

  • Paramètre $message:

  • Le paramètre $message désigne le message à envoyer au(x) destinataire(s). Il peut être en format texte ou HTML. Les mails en format HTML peuvent avoir un contenu formaté à l'aide de balises HTML, des images ou des arrière-plan. Ils auront l'air comme si leur code était exécuté par le navigateur.

  • Paramètre $entetes:

  • Le paramètre $entetes est facultatif mais très utile. Il spécifie les informations supplémentaires qui seront envoyées avec le mail. Un entête respecte la forme propriété:valeur. Si plusieurs entêtes sont combinés alors il faut les séparer par n.

    Voici la liste des entêtes les plus utilisés:
    • From: désigne l'adresse de l'expéditeur.
    • Cc: (pour Carbon Copy) désigne l'adresse qui recevra une copie du mail.
    • Bcc: (pour Blind Carbon Copy) désigne l'adresse qui recevra une copie cachée du mail.
    • Reply-To: spécifie l'adresse de réponse.
    • Content-Type: spécifie l'encodage du mail. S'il n'est pas spécifié alors il s'agit d'un mail en format texte. Si on veut envoyer un mail en format HTML on peut alors spécifier l'encodage suivant: text/html; charset="iso-8859-1" ou text/html; charset="utf-8"...


    Exemple:
    <?php
       $dest="contact@chiny.me";
       $objet="Rendez-vous";
       $message="
          <font face='arial'>
          Bonjourn
          Prière de se retrouver sur Skype à <b>18h</b> aujourd'hui.n
          Merci et bonne journée.
          </font>
       ";
       $entetes="From: sc@example.comn";
       $entetes.="Cc: chiny@example.comn";
       $entetes.="Content-Type: text/html; charset=iso-8859-1";
       
       if(mail($dest,$objet,$message,$entetes))
          echo "Mail envoyé avec succès.";
       else
          echo "Un problème est survenu.";
       exit;
    ?>

    Serveur SMTP

    Si vous exécutez le code précédent sur le localhost vous aurez probablement quelque chose qui ressemble à ceci:
    Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set().
    Un problème est survenu.
    Le message est explicite. En réalité, ce n'est pas votre serveur Web qui se charge d'envoyer le mail, mais un serveur SMTP qui peut être installé sur la même machine qui accueille le serveur Web ou sur une machine différente.

    Si vous avez opté pour un hébergement mutualisé auprès d'un hébergeur, alors le problème ne se posera pas. En effet, votre serveur est préalablement configuré et vous pouvez ainsi envoyer des mails à l'aide PHP sans problème. Cependant, si vous disposez de votre propre serveur ou que vous voulez envoyer des mails depuis un script hébergé sur le "localhost", dans ce cas vous devez déclarer le serveur SMTP qui sert de relais. Vous avez donc le choix entre deux méthodes:
    • Manipulation du fichier php.ini
    • Utilisation de la fonction ini_set()


  • Manipulation du fichier php.ini:

  • Le fichier php.ini contient des directives qui permettent de définir les paramètres SMTP comme ceci:
    SMTP = localhost
    smtp_port = 25
    A la place de "localhost" vous pouvez déclarer l'adresse d'un serveur SMTP fonctionnel, qu'on appelle aussi relais SMTP. Le port 25 est utilisé par défaut par ce protocole.

  • Fonction ini_set():

  • Si pour une raison quelconque vous ne pouvez (ou ne voulez) pas modifier le fichier php.ini, la fonction ini_set() est là pour vous servir.

    La fonction ini_set( $directive , $nouvelleValeur ) permet de changer temporairement la configuration PHP définie par php.ini. Elle agit sur la directive $directive en lui attribuant la valeur $nouvelleValeur.

    Exemple:
    <?php
       ini_set("SMTP","localhost");
       ini_set("smtp_port","25");
    ?>
    Cette configuration dure aussi le longtemps que le script est exécuté. A la fin de celui ci, la configuration par défaut (définie dans php.ini) est rétablie.
    La plupart des relais SMTP ne sont plus accessibles à tout le monde, en raison de leur utilisation abusives par les spammers, qui envoient des mails nuisibles au clients à travers eux.

    Classe PHPMailer

    PHPMailer est une classe qui renferme des méthodes qui permettent de construire, formater et envoyer des emails en PHP. Elle facilite remarquablement l'opéation d'envoie des emails vue qu'elle permet de regrouper tous les paramètres en un seul endroit, y compris les paramètres du serveur SMTP comme l'adresse, le port, le type de sécurité, le login et le mot de passe.
    La classe PHPMailer facilite aussi la manipulation des pièces jointes.
    Je vous renvoie sur le code source de la classe PHPMailer disponible gratuitement sur GiHub https://github.com/PHPMailer/PHPMailer. Des exemples y sont également disponibles pour vous initier à l'utilisation de cette classe.