Aller au contenu principal

PHPMailer

Présentation de la bibliothèque

PHPMailer est une bibliothèque de code PHP qui permet d'envoyer des e-mails depuis un script PHP. Cette bibliothèque offre plusieurs fonctionnalités :

  • l'envoi d'e-mails via SMTP,
  • l'envoi d'e-mails avec pièces jointes,
  • l'envoi d'e-mails en HTML, etc.

Pour utiliser PHPMailer, vous devez d'abord l'installer via Composer, avec la commande : composer require phpmailer/phpmailer.

Une fois PHPMailer installé, vous pouvez l'utiliser dans votre script PHP en l'incluant avec la commande use PHPMailer\PHPMailer\PHPMailer;.

attention

Il faut bien sûr inclure l'autoload de Composer avec la ligne :

require 'vendor/autoload.php';

dans votre code PHP.

Exemple pratique

Voici un exemple simple d'envoi d'un e-mail avec PHPMailer :

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
$mail->setFrom('from@example.com', 'Mailer');
$mail->addAddress('joe@example.net', 'Joe User');
$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body <b>in bold!</b>';

$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

Dans cet exemple, nous créons un nouvel objet PHPMailer, définissons l'expéditeur et le destinataire de l'e-mail, définissons le sujet et le corps de l'e-mail, puis envoyons l'e-mail avec la méthode send().

Test de mémorisation/compréhension


Qu'est-ce qu'un fichier .env ?


Comment accédez-vous à une variable d'environnement en PHP ?


Où placez-vous généralement le fichier .env dans votre projet ?


Pourquoi utiliseriez-vous un fichier .env ?


Qu'est-ce qu'un fichier .gitignore ?


Qu'est-ce qu'un fichier .env.example ?


Pourquoi utiliseriez-vous un fichier .env.example ?


TP - Envoi d'un mail

Dans ce TP, vous allez créer un petit formulaire de contact qui envoie un e-mail lorsque quelqu'un remplit le formulaire.

Vous utiliserez PHPMailer pour envoyer l'e-mail.

Pour réaliser ce TP, suivez les étapes suivantes :

  1. Créez un nouveau fichier HTML, nommez-le index.html. Dans ce fichier, créez un formulaire avec trois champs : "Votre nom", "Votre email" et "Votre message". Le formulaire doit avoir une méthode POST et l'action doit être send_mail.php :
<!-- fichier index.html -->
<form action="send_mail.php" method="post">

...

</form>
  1. Créez un nouveau fichier PHP, nommez-le send_mail.php. Dans ce fichier, vous allez utiliser PHPMailer pour envoyer l'e-mail.

  2. Pour configurer PHPMailer avec les paramètres de connexion au serveur SMTP d'Infomaniak, utilisez le code suivant :

$mail = new PHPMailer(true);

$mail->isSMTP();
$mail->Host = 'mail.infomaniak.com';
$mail->SMTPAuth = true;
$mail->Username = 'your-email@ik.me';
$mail->Password = 'your-password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 587; // ou 465
Les ports SMTP 465 et 587

Les ports SMTP 465 et 587 sont utilisés pour l'envoi d'e-mails à travers le réseau Internet.

  • Le port 465 a été initialement désigné pour le SMTP sécurisé via SSL (Secure Sockets Layer), permettant ainsi une communication chiffrée directe dès la connexion. Le port 465 est désormais obsolète et remplacé par le port 587, qui est recommandé pour la soumission de courriels par les clients de messagerie.

  • Le port 587 utilise STARTTLS, une extension du protocole SMTP qui permet de passer d'une connexion non sécurisée à une connexion sécurisée TLS (Transport Layer Security) avant l'envoi des données, ce qui renforce la sécurité des communications électroniques.

Remplacez 'your-email@ik.me' par votre adresse e-mail Infomaniak et 'your-password' par votre mot de passe.

  1. Ensuite, utilisez les données du formulaire pour définir l'expéditeur, le destinataire, le sujet et le corps de l'e-mail.

  2. Enfin, utilisez la méthode send() de PHPMailer pour envoyer l'e-mail.

    Puisque que nous faisons appel à une ressource extérieure (le serveur de mail) nous allons placer le code d'envoi du mail dans un bloc try catch :

     try {

    ...

    echo 'Message has been sent';
    } catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
    }
Une solution possible

Voici comment vous pouvez faire cela :

<!-- fichier index.html -->
<form action="send_mail.php" method="post">
<label for="name">Votre nom :</label><br>
<input type="text" id="name" name="name"><br>
<label for="email">Votre email :</label><br>
<input type="text" id="email" name="email"><br>
<label for="message">Votre message :</label><br>
<textarea id="message" name="message"></textarea><br>
<input type="submit" value="Envoyer">
</form>
// fichier send_mail.php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
$mail->isSMTP();
$mail->Host = 'mail.infomaniak.com';
$mail->SMTPAuth = true;
$mail->Username = 'your-email@ik.me'; // Remplacez par votre adresse e-mail Infomaniak
$mail->Password = 'your-password'; // Remplacez par votre mot de passe
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 587;

$mail->setFrom($_POST['email'], $_POST['name']);
$mail->addAddress('your-email@example.com'); // Remplacez par votre adresse e-mail
$mail->Subject = 'Nouveau message de ' . $_POST['name'];
$mail->Body = $_POST['message'];

$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
Si erreur : "activate openssl"

Pour activer l'extension PHP openssl sous Windows, suivez les étapes suivantes :

  1. Trouver le fichier php.ini :

    • Recherchez le fichier php.ini avec la commande php --ini.
  2. Décommenter l'extension openssl :

    • Ouvrez le fichier php.ini avec un éditeur de texte.
    • Recherchez la ligne ;extension=openssl.
    • Supprimez le point-virgule au début de la ligne pour décommenter l'extension : extension=openssl.
  3. Télécharger le certificat CA Root :

  4. Configurer le chemin du certificat dans php.ini :

    • Trouvez la section [openssl] dans le fichier php.ini.
    • Ajoutez ou modifiez la ligne suivante pour indiquer le chemin vers le certificat CA Root que vous avez téléchargé :
      openssl.cafile=c:\php\cacert.pem
  5. Redémarrer le serveur Web :

    • Après avoir effectué ces modifications, enregistrez le fichier php.ini.
    • Redémarrez votre serveur Web pour que les changements prennent effet.

Une fois ces étapes suivies, l'extension openssl devrait être activée et prête à être utilisée dans vos scripts PHP sur Windows.

attention

Il ne faut pas stocker des informations confidentielles dans vos fichiers PHP !

Pour cela il est préconisé d'utiliser des variables d'environnement.

TP - Envoi d'un mail sécurisé

Dans ce TP, vous allez toujours utiliser votre formulaire de contact mais vous allez utilisez des variables d'environnement pour stocker vos informations confidentielles qui vont servir à envoyer un e-mail lorsque quelqu'un remplit le formulaire.

Pour réaliser ce TP, suivez les étapes suivantes :

  1. Créez un dossier tp-mail-env dans le dossier de vos Documents.

  2. Dans votre dossier tp-mail-env, installez la bibliothèque PHPMailer avec la commande composer require phpmailer/phpmailer.

  3. Créez le fichier .env :

SMTP_HOST=mail.infomaniak.com
SMTP_USERNAME=your-email@ik.me
SMTP_PASSWORD=your-password
  1. Dans le fichier .env, définissez les variables SMTP_HOST, SMTP_USERNAME et SMTP_PASSWORD avec les informations de connexion à votre serveur SMTP Infomaniak.

  2. Créez le fichier send_mail.php pour :

  • charger le fichier .env,
  • configurer PHPMailer
  • et envoyer un mail.
...

$mail->Host = $_ENV['SMTP_HOST'];
$mail->Username = $_ENV['SMTP_USERNAME'];
$mail->Password = $_ENV['SMTP_PASSWORD'];

...
  1. Remplacez mon-email@example.com par votre adresse email.

  2. Démarrez le serveur Web intégré à PHP.

  3. Tester l'envoi d'un mail, à partir de votre navigateur.

Pour plus d'infos, vous pouvez consulter le tutoriel Utilisation d'un fichier .env.

Une solution plus sécurisée