PHP (PHP Hypertext Preprocessor)

Auteur: Mohamed CHINY Durée necessaire pour le cours de PHP (PHP Hypertext Preprocessor) Niveau recommandé pour le cours de PHP (PHP Hypertext Preprocessor) Supports vidéo non 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. Une entête respecte la forme propriété:valeur. Si plusieurs entêtes sont combinées alors il faut les séparer par \n.

    Voici la liste des entêtes les plus utilisées:
    • 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'>
          Bonjour\n
          Prière de se retrouver sur Skype à <b>18h</b> aujourd'hui.\n
          Merci et bonne journée.
          </font>
       ";
       $entetes="From: sc@example.com\n";
       $entetes.="Cc: chiny@example.com\n";
       $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;
    ?>

    Serveuer 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.