Développement d'applications Web avec LAMP

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

Envoyer du courriel

Dernière mise à jour le 24 novembre 2025

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 ancien des MTA (Mail Transfer Agents).

Installer Sendmail

Vous n'avez pas à installer Sendmail étant donné qu'il est déjà installé sur le serveur d'hébergement. Ce qui suit est quand même valide s'il s'agit de votre propre serveur.

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

Cet exemple ne fonctionne plus en 2025. Les exigences actuelles en matière de sécurité dans les échanges de courriel font que plusieurs de ces techniques simples sont maintenant inopérantes.

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 avec Sendmail

Cet exemple ne fonctionne plus en 2025.

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 :

Envoyer un courriel 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.

Vous n'avez pas à installer Composer étant donné qu'il est déjà installé sur le serveur d'hébergement. Ce qui suit est quand même valide s'il s'agit de votre propre serveur.

$ sudo apt install composer
...
$

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

Ça vous devez tous le faire :)

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

Soyez patients car l'installation pourrait prendre de une à deux minutes. Vous remarquerez que des sous-répertoires et des fichiers ont été ajoutés à votre répertoire de projet.

Enfin, essayez le code suivant (une fois de plus ce code ne fonctionnera probablement pas, mais on approche de la solution) :

<?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 et qui n'était pas situé aux États-Unis.

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.

Ensuite...

  1. remplir le petit formulaire d'inscription;
  2. choisir le plan "Gratuit";
  3. répondre au courriel de vérification envoyé à l'adresse courriel fournie;
  4. aller à l'onglet "Développeur";
  5. cliquer sur "Création d'une clé API";
  6. noter quelque part la clé API et la clé secrète, vous en aurez besoin.

Vous pouvez maintenant quittez le site Mailjet.

Exemple de code avec Mailjet

Dans l'exemple suivant, Bob (bob@hotmail.com) utilise son compte Mailjet pour envoyer un courriel à son ami Alain (alain.patoche@gmail.com).

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}";
}