3. Email

Séance 3 : mails

Dans cette séance nous allons mettre en place un système de mail pour vérifier l'utilisateur lors de son inscription, et lui permettre de récupérer son mot de passe en cas d'oubli.

Envoyer des mails en PHP

L'envoi d'un email en php se fait en utilisant la fonction mail https://www.php.net/manual/fr/function.mail.php. Cette fonction permet d'envoyer des emails basiques. Bien souvent, sur de plus gros projets on utilisera des librairies qui permettront un plus grand contrôle et une écriture un peu plus simple, notamment si l'on souhaite intégrer des pièces jointes ou définir des en-têtes de manière précise.

Pour pouvoir envoyer des emails, il faut avoir un serveur SMTP. Il existe plusieurs solutions pour cela, mais la plus simple est d'utiliser un service en ligne comme https://mailtrap.io/. Il suffit de créer un compte, et de créer un serveur SMTP. Vous obtiendrez alors un username et un mot de passe, que vous pourrez utiliser dans votre code.

L'utilisation de la fonction mail est relativement simple, elle prend a minima les paramètres suivants :

  • le destinataire

  • le sujet

  • le message

mail('mail@gmail.com', 'Le Sujet de mon mail', 'Tout le message de mon mail');

Dans l'exemple ci-dessus, le message et le mail envoyé sont au format texte. Nous verrons un peu plus loin comment envoyer un message avec du HTML.

Si l'on souhaite préciser l'expéditeur, le mail de réponse, ... il faut définir le 4eme paramètre, qui comprend l'en-tête du mail. Sa structure est un peu particulière, vous avez un exemple ci-dessous.

$headers = 'From: webmaster@example.com' . "\r\n" .
     'Reply-To: webmaster@example.com' . "\r\n" .
     'X-Mailer: PHP/' . phpversion();

Pour envoyer un email en HTML, il faut définir toute la page HTML dans le message, puis définir les headers afin de préciser que vous envoyer un email au format HTML. Ci-dessous un exemple avec également plusieurs destinataires.

<?php
     // Plusieurs destinataires
     $to  = 'johny@example.com, sally@example.com'; // notez la virgule

     // Sujet
     $subject = 'Calendrier des anniversaires pour Août';

     // message
     $message = '
     <html>
      <head>
       <title>Calendrier des anniversaires pour Août</title>
      </head>
      <body>
       <p>Voici les anniversaires à venir au mois d\'Août !</p>
       <table>
        <tr>
         <th>Personne</th><th>Jour</th><th>Mois</th><th>Année</th>
        </tr>
        <tr>
         <td>Josiane</td><td>3</td><td>Août</td><td>1970</td>
        </tr>
        <tr>
         <td>Emma</td><td>26</td><td>Août</td><td>1973</td>
        </tr>
       </table>
      </body>
     </html>
     ';

     // Pour envoyer un mail HTML, l'en-tête Content-type doit être défini
     $headers[] = 'MIME-Version: 1.0';
     $headers[] = 'Content-type: text/html; charset=iso-8859-1';

     // En-têtes additionnels
     $headers[] = 'To: Mary <mary@example.com>, Kelly <kelly@example.com>';
     $headers[] = 'From: Anniversaire <anniversaire@example.com>';
     $headers[] = 'Cc: anniversaire_archive@example.com';
     $headers[] = 'Bcc: anniversaire_verif@example.com';

     // Envoi
     mail($to, $subject, $message, implode("\r\n", $headers));
?>

Exercice

Ecrire un fichier PHP, hors projet MVC, qui vous envoie un email.

Envoi d'un mail de confirmation

Pour envoyer un mail de confirmation, nous allons utiliser la fonction mail. Nous allons également utiliser la fonction https://www.php.net/manual/fr/function.hash.php pour générer un hash aléatoire, qui servira de clé de vérification. Nous allons également utiliser la fonction https://www.php.net/manual/fr/function.time.php pour récupérer le timestamp actuel, qui servira à définir une chaîne aléatoire unique.


// On génère un hash aléatoire
$hash = hash('sha256', time().rand());

//on doit sauvegarder le hash dans la base de données pou pouvoir faire la vérification

...

// On prépare le mail contenant le lien d'activation
$destinataire = $email;
$sujet = "Activer votre compte" ;
$entete = "From:contact@site.com" ;

// Le lien d'activation est composé du login(log) et de la clé(cle)
$message = 'Bienvenue sur le site,

Pour activer votre compte, veuillez cliquer sur le lien ci dessous
ou copier/coller dans votre navigateur internet.

http://www.votresite.com/activation.php?log='.urlencode($login).'&cle='.urlencode($hash).'
---------------
Ceci est un mail automatique, Merci de ne pas y répondre.';

mail($destinataire, $sujet, $message, $entete) ; // Envoi du mail

Vérifier la clé de vérification

Pour vérifier la clé de vérification, nous allons utiliser la fonction https://www.php.net/manual/fr/function.hash-equals.php. Cette fonction permet de comparer deux chaines de caractères de manière sécurisée. Elle permet notamment de s'assurer que les deux chaines de caractères ont la même longueur, et qu'aucun caractère n'a été modifié.


// On récupère les deux variables
$log = $_GET['log'];
$cle = $_GET['cle'];

// On récupère la clé correspondant au $log dans la base de données

...

// On vérifie que les deux clés sont identiques

if (hash_equals($cle, $clebdd)) {
    // On active le compte
    // On supprime la clé de vérification
}
else {
    // La clé n'est pas bonne
}

Exercice 1

Créer un formulaire d'inscription avec les champs suivants :

  • nom

  • prénom

  • email

  • login (si ce n'est pas le mail)

  • Ajoutez la route, la vue associée

  • Ajouter la route et la vue pour effectuer la sauvegarde dans la base de données et envoyer un mail de confirmation

  • Ajouter la route qui sera appelée par le lien du mail de confirmation

  • Mettez à jour la base de données pour activer l'utilisateur et supprimer la clé de vérification

Exercice 2

Gestion du mot de passe perdu. La logique serait assez similaire à l'exercice 1.

  • Ajoutez la route, la vue associée pour récupérer l'email de l'utilisateur ayant perdu son mot de passe

  • Ajoutez la route et la vue pour effectuer la sauvegarde dans la base de données et envoyer un mail avec un lien pour réinitialiser le mot de passe

  • Ajoutez la route et la vue pour réinitialiser le mot de passe, suite au clic sur le lien du mail, avec un formulaire permettant de saisir le nouveau mot de passe (pour sécuriser l'échange, il faut que le lien contienne un hash aléatoire, et que ce hash soit sauvegardé dans la base de données)

  • Ajoutez la route et la vue pour sauvegarder le nouveau mot de passe. Mettez à jour la base de données pour supprimer le hash aléatoire

Configurer un server SMTP en local

Avec Wamp sous windows

https://waytolearnx.com/2020/01/comment-configurer-wampserver-pour-envoyer-un-mail-depuis-localhost-en-php.html et https://grafikart.fr/blog/mail-local-wamp

Last updated