Développement d'applications Web avec LAMP

Document d'accompagnement pour le cours 420-KB9-LG

Envoyer du courriel

Dernière mise à jour le 7 novembre 2022

Sendmail

Sendmail est un serveur de messagerie électronique dont le code source est ouvert. Il se charge de la livraison et de l'envoi de courriel. Il n'est pas le plus performant, mais probablement le plus aciens des MTA (Mail Transfer Agents).

Installer Sendmail

Ouvrez un terminal et commencez par mettre à jour la liste des paquets logiciels :

$ sudo apt update
...
$

Installez ensuite le paquet "sendmail" :

$ sudo apt install sendmail
...
$

Lancez le programme de configuration et répondez "Y" (ou pressez sur "Enter") à toutes les questions :

$ sudo sendmailconfig
...
$

Enfin, redémarrez le serveur Web :

$ sudo service apache2 restart
$

Envoyer un message dans un terminal

Une façon rapide de vérifier si tout fonctionne bien est d'envoyer un courriel directement dans la console.

Dans l'exemple suivant, un usager fictif (Bob) va utiliser votre serveur pour envoyer un message à destination de votre véritable adresse électronique.

Supposez que vous êtes Patoche et que vous disposez d'une adresse électronique valide (alain.patoche@gmail.com). Utilisez les instructions suivantes pour vous envoyer un message :

$ sendmail -v alain.patoche@gmail.com <-- votre véritable adresse
From: bob@hotmail.com                 <-- adresse fictive
Subject: Jusse un tesse
Ceci est la première ligne
et ceci est la deuxième
.

Les chaînes "From:" et "Subject:" ne sont pas générées par Sendmail et vous devez les écrire vous-mêmes. On termine le message par un point en début de ligne.

Une fois le message envoyé et grâce à l'option "-v", vous verrez s'écrire dans la console tout l'échange entre le serveur de courrier sortant (celui de Patoche) et celui de courrier entrant (Bob). Le protocole utilisé est SMTP (Simple Mail Transfer Protocol).

Enfin, connectez-vous à votre application de courrier électronique et vérifier l'arrivée du message. Notez qu'il aura probablement déjà été placé dans le dossier "pourriel".

Envoyer un courriel dans un script PHP

Le code suivant montre comment envoyer un courriel avec PHP. On suppose ici que Sendmail a été correctement installé.

<?php
  // on est arrivé ici via un formulaire
  if ($_SERVER['REQUEST_METHOD'] == "POST") {

    // entêtes (il y en a d'autres et tous ne sont pas obligatoires)
    $destinataire = $_POST['destinataire'];
    $sujet        = $_POST['sujet'];
    $message      = $_POST['message'];
    $entetes      = "From: "     . $_POST['origine'] . "\r\n" .
                    "Reply-To: " . $_POST['origine'] . "\r\n" .
                    "Content-Type: text/plain; charset=utf-8\r\n" .
                    "X-Mailer: PHP/'". phpversion();

    // la fonction "mail" retourne un booléen
    $code = mail($destinataire, $sujet, $message, $entetes);

    // la valeur TRUE ne garantit pas la livraison à 100%
    if (!$code) {
      echo '<h3 style="color:red">Le message n\'a pas été envoyé</h3>';
    } else {
      echo '<h3 style="color:green">Le message a été envoyé avec succès</h3>';
    }
  }
?>

Il ne vous reste plus qu'à coder un formulaire pour entrer le message. Voici une version minimaliste :

<form method="POST">
  Destinataire <input type="text" name="destinataire"><br>
  Sujet        <input type="text" name="sujet"><br>
  Message      <input type="text" name="message"><br>
  Origine      <input type="text" name="origine"><br>
  <input type="submit">
</form>

Quelques remarques :

Avec la classe PHPMailer

PHPMailer est une bibliothèque logicielle d'envoi de courriels en PHP. Il s'agit d'une solution plus avancée que le bon vieux Sendmail.

Commencez par installer le gestionnaire de dépendances Composer.

$ sudo apt install composer
...
$

Déplacez-vous ensuite à l'intérieur du répertoire de votre application et installez-y PHPMailer.

$ cd public_html/mon_labo/
$ composer require phpmailer/phpmailer
...
$

Soyez patients, car l'installation peut prendre de une à deux minutes.

Enfin, essayez le code suivant :

<?php

// tout ce qui regarde les "namespace" et l'auto-chargement des classes sera abordé plus tard
use \PHPMailer\PHPMailer\PHPMailer;
use \PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

// création d'une instance
$mail = new PHPMailer(TRUE);

// origine (adresse fictive)
$mail->setFrom('bob@gmail.com', 'Robert Gratton');

// destination (votre véritable adresse)
$mail->addAddress('alain.patoche@gmail.com', 'Alain Patoche');

// sujet
$mail->Subject = 'Test';

// le message comme tel
$mail->Body = 'Yo Patoche!';

// important pour les caractères accentués
$mail->CharSet = 'UTF-8';
   
// envoi du courriel
if (! $mail->send() ) {
  echo "Quelque chose a foiré";
} else {
  echo "Message envoyé avec succès";
}

Encore une fois méfiez-vous : même si aucune erreur est détectée, il n'est pas garanti que le message soit parvenu à destination!

Utiliser un relai SMTP

Vos messages auront plus de chance d'arriver à destination (ou de ne pas être considérés comme des pourriels) s'ils sont envoyés non pas de votre propre serveur SMTP, mais d'un serveur SMTP bien connu.

Plusieurs sites Web offrent de tels serveurs SMTP pour envoyer des courriels à partir de nos applications Web. Certains proposent même d'utiliser leurs serveurs gratuitement, tant que le nombre mensuel d'envois ne dépasse pas un certain seuil. C'est le cas pour Mailjet.

Remarque : Mailjet n'est pas le seul service de relai SMTP existant. J'ai simplement arrêté ma recherche au premier qui me semblait relativement simple d'utilisation.

Procédure d'inscription au service Mailjet

Cette section explique la procédure d'inscription au service Mailjet et présente plus loin un exemple de code pour l'utiliser.

Rendez-vous d'abord à la page https://app.mailjet.com/signup?lang=fr_FR.

Dans le premier formulaire (à droite de la page), entrez d'abord dans le champ Email votre adresse courriel existante. C'est cette adresse qui sera votre identificateur sur le site Mailjet.

Entrez ensuite dans le champ Mot de passe le mot de passe que vous utiliserez chez Mailjet. N'oubliez pas de noter cette information quelque part.

Après avoir confirmé que vous n'êtes pas un robot (si c'est vraiment le cas), cliquez sur le bouton Créer un compte.

Sur cette nouvelle page, remplissez le formulaire de votre mieux. Au besoin, inventez quelques informations. Cliquez ensuite sur le bouton Suivant.

Dans le formulaire Données de facturation (à gauche dans la page) ne cochez pas la boìte Ajoutez votre méthode de paiement. Ce n'est pas nécessaire pour l'usage que vous ferez de ce service. Cliquez sur le bouton Terminer la commande.

Rendez-vous dans votre boîte de courriel habituelle et ouvrez le message de confirmation d'inscription qui vient d'être envoyé par Mailjet.

Cliquez sur le bouton ou sur l'hyperlien. Vous serez redirigé vers une page de bienvenue.

Allez dans la section Développeur (à droite dans la page) et cliquez sur le bouton Commencer.

Il est maintenant inutile de suivre le parcours prévu. Allez directement dans le menu déroulant en haut à droite et sélectionnez Préférences du compte.

À partir de la section Expéditeurs & Domaines, rendez-vous dans Paramètres SMTP et Send API.

Dans Informations d'identification (API et SMTP) (à gauche dans la page), cliquez sur le bouton Récupérer mes identifiants API et notez bien la CLÉ API (chaîne de 32 caractères). Générez ensuite une CLÉ SECRÈTE (uen autre chaîne de 32 caractères) et notez bien cette information.

Vous pouvez maintenant quittez le site Mailjet.

Exemple de code avec Mailjet

Dans l'exemple suivant, on utilise Mailjet pour envoyer un courriel à "alain.patoche@gmail.com", en spécifiant comme adresse d'origine "bob@hotmail.com". Cette dernière doit aussi exister (ou du moins avoir une syntaxe valide et un domaine existant) puisqu'elle sera vérifiée.

L'exemple fonctionne très bien dans des conditions idéales, mais sachez que le serveur qui reçoit le message pourrait toujours le considérer comme indésirable ("spam").

<?php

// pour utiliser la bibliothèque PHPMailer, référez-vous aux notes de cours
use \PHPMailer\PHPMailer\PHPMailer;
use \PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

// crée une instance de PHPMailer et active les exceptions
$mail = new PHPMailer(true);

try {
  // paramètres du serveur
  $mail->isSMTP();     
  $mail->Host       = "in-v3.mailjet.com";
  $mail->Port       = 587;
  $mail->SMTPAuth   = true;
  $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;

  // données de connexion fournies par Mailjet
  $mail->Username   = "..."; // votre clé API
  $mail->Password   = "..."; // votre clé secréte

  // adresse d'origine, l'existence du domaine sera vérifié par Mailjet (vous
  // pouvez utiliser ici votre adresse personnelle)
  $mail->setFrom('bob@hotmail.com', 'Robert Gartton');

  // adresse de destination
  $mail->addAddress("alain.patoche@gmail.com", "Alain Patoche");
  // autres adresses (facultatif)
  // $mail->addAddress(...);

  // adresse de réponse (facultatif)
  $mail->addReplyTo('bob@hotmail.com', 'Robert Gartton');

  // contenu
  $mail->IsHTML(true);
  $mail->Subject    = "Message de Boromir";
  $mail->Body       = "Never trust user input!";
  $mail->AltBody    = "Message pour les clients de courriel qui n'affichent pas le HTML";

  // envoi du message
  $mail->send();
  echo "Message envoyé avec succès";
} catch (Exception $e) {
  echo "Échec de l'envoi du message. Erreur : {$mail->ErrorInfo}";
}