Guide PHPMailer : Configuration, Configuration SMTP et Envoi d’Emails

On février 11, 2025
15min read
Dmitriy Shcherbakan Full Stack Developer @Railsware
Ivan Djuric, an author at Mailtrap
Ivan Djuric Technical Content Writer @Mailtrap

Lorsqu’il s’agit d’ajouter des fonctionnalités d’email à votre application PHP, la classe PHPMailer est l’option gagnante.

Dans cet article, je vais décrire le processus d’installation de PHPMailer, la configuration des paramètres SMTP et l’ajout de la fonctionnalité d’envoi d’emails à votre application étape par étape.

Pour passer directement à l’action, cliquez ici.

Les extraits de code que je fournis dans cet article sont pour PHPMailer 6.9, qui est compatible avec PHP 5.5 et versions supérieures.

Prêt à livrer des emails ?
Essayez Mailtrap gratuitement

Qu’est-ce que PHPMailer ?

PHPMailer est la bibliothèque classique open-source d’envoi d’emails pour PHP. Elle est compatible avec la plupart des frameworks PHP, comme Laravel et Symfony et est utilisée par de nombreux projets open-source comme WordPress. Elle prend également en charge plusieurs méthodes d’envoi de messages email, notamment la plus fiable, l’envoi direct vers les serveurs SMTP, ainsi que la fonction PHP mail(), Sendmail et qmail.

Parmi les fonctionnalités les plus importantes de PHPMailer, on trouve :

  • L’authentification SMTP
  • La validation automatique des adresses email
  • La protection contre les attaques par en-tête d’hôte
  • Le support des protocoles TLS et SSL
  • Le support des signatures DKIM et S/MIME
  • Le support des images intégrées
  • Le support pour l’ajout de pièces jointes, y compris en ligne
  • Formats multiples, chaînes de caractères et pièces jointes binaires.
  • Les emails multipart/alternatifs pour les clients qui ne lisent pas les emails HTML
  • Le support pour l’envoi d’emails avec plusieurs adresses To, CC, BCC et Reply-to

Comment installer PHPMailer

Pour installer PHPMailer, vous aurez besoin de Composer, un gestionnaire de dépendances pour PHP, recommandé par les créateurs de PHPMailer sur GitHub.

Une fois installé, ajoutez cette ligne à votre fichier composer.json :

"phpmailer/phpmailer": "^6.9"

Ou exécutez la commande suivante :

composer require phpmailer/phpmailer

Note:

  • Le dossier vendor et le script vendor/autoload.php ne font pas partie de PHPMailer. Ils sont générés par Composer.

Si vous n’êtes pas fan de Composer, vous pouvez télécharger les fichiers PHPMailer avec le code source manuellement et copier le contenu du dossier dans un répertoire include_path spécifié dans votre configuration PHP et charger chaque fichier de classe manuellement, comme ceci :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

Ajouter une classe Exception vous aidera à gérer les erreurs et à les déboguer. En PHP, cela fonctionne de manière similaire aux autres langages de programmation. Donc, sans elle, s’il y a une erreur dans votre code d’envoi d’email, vous verrez simplement un message indiquant que la classe Exception n’est pas trouvée, mais vous n’aurez aucun détail sur la façon de la déboguer.

Vous pouvez également installer PHPMailer avec uniquement les fichiers essentiels. Les fichiers PHP clés à inclure sont src/PHPmailer.php et src/SMTP.php si vous utilisez SMTP. Vous aurez également besoin de src/OAuth.php si vous utilisez XOAUTH2 et les dépendances pour les services avec lesquels vous souhaitez vous authentifier. Et vous pouvez ignorer le dossier language si les erreurs en anglais ne vous dérangent pas.

Pour plus d’informations sur l’installation de PHPMailer, vous pouvez consulter le manuel d’installation officiel.

Paramètres SMTP de PHPMailer

L’envoi d’emails avec PHPMailer est optimal lorsqu’il est couplé à un serveur SMTP externe. Cela le rend fiable et sécurisé car il peut être chiffré (TLS/SSL), ce qui en fait un choix idéal pour votre application PHP.

Consultez la configuration SMTP de base dans l’exemple ci-dessous :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Ajustez le chemin si nécessaire si vous n'utilisez pas Composer

$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->isSMTP();                                            // Utiliser SMTP
    $mail->Host       = 'smtp.exemple.com';                     // Spécifiez le serveur SMTP
    $mail->SMTPAuth   = true;                                   // Activer l'authentification SMTP
    $mail->Username   = 'votre_email@exemple.com';               // Nom d'utilisateur SMTP
    $mail->Password   = 'votre_mot_de_passe';                        // Mot de passe SMTP
    $mail->SMTPSecure = 'tls'; // Activer le chiffrement TLS
    $mail->Port       = 587;                                    // Port TCP pour la connexion

Une fois que vous avez vos détails et identifiants SMTP, il vous suffit de remplacer les placeholders dans ce code par ceux-ci, ce que je vous montrerai dans le chapitre suivant.

Comment envoyer des emails avec PHPMailer et SMTP

Pour envoyer des emails avec PHPMailer, j’ai choisi le SMTP de Email API/SMTP de Mailtrap car il offre des taux de délivrabilité élevés. De plus, Mailtrap me permet de tester mes emails avant de les envoyer (je décrirai cela plus tard dans l’article) et il est très facile à configurer.

Voici comment cela fonctionne :

  • Naviguez vers la fenêtre SMTP/API Settings sous Sending Domains, où vous trouverez les identifiants SMTP. Notez que l’envoi via API ne fonctionne pas avec PHPMailer.
Capture d'écran des paramètres SMTP/API de Mailtrap.
  • Copiez et collez les identifiants du Transactional Stream dans votre script PHP.

Et enfin, voici comment vous pouvez envoyer un email en texte brut avec vos identifiants SMTP Mailtrap :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Ajustez selon votre méthode d'installation

$mail = new PHPMailer(true); // Activer les exceptions

// Configuration SMTP
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io'; // Votre serveur SMTP
$mail->SMTPAuth = true;
$mail->Username = 'votre_nom_utilisateur'; // Votre nom d'utilisateur Mailtrap
$mail->Password = 'votre_mot_de_passe'; // Votre mot de passe Mailtrap
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

// Paramètres d'expéditeur et destinataire
$mail->setFrom('de@exemple.com', 'Nom Expéditeur');
$mail->addAddress('destinataire@exemple.com', 'Nom Destinataire');

// Envoi d'email en texte brut
$mail->isHTML(false); // Définir le format d'email en texte brut
$mail->Subject = 'Votre Sujet Ici';
$mail->Body    = 'Ceci est le corps du message en texte brut';

// Envoyer l'email
if(!$mail->send()){
    echo 'Le message n\'a pas pu être envoyé. Erreur : ' . $mail->ErrorInfo;
} else {
    echo 'Le message a été envoyé';
}

Assurez-vous que votre méthode isHTML est définie sur false pour envoyer des emails en texte brut.

Envoyer des emails HTML

Plongez dans la personnalisation des emails HTML en PHP en consultant notre article dédié.

Pour envoyer un email HTML, définissez simplement la propriété isHTML sur (true), comme dans l’exemple ci-dessous :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/composer/vendor/autoload.php'; // Assurez-vous que le chemin est correct

$mail = new PHPMailer(true); // Passer `true` active les exceptions

try {
    $mail->isSMTP();
    $mail->Host = 'live.smtp.mailtrap.io'; // Votre serveur SMTP
    $mail->SMTPAuth = true;
    $mail->Username = 'collez celui généré par Mailtrap'; // Votre nom d'utilisateur Mailtrap
    $mail->Password = 'collez celui généré par Mailtrap'; // Votre mot de passe Mailtrap
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;

    // Paramètres d'expéditeur et destinataire
    $mail->setFrom('info@mailtrap.io', 'Mailtrap');
    $mail->addReplyTo('info@mailtrap.io', 'Mailtrap');
    $mail->addAddress('destinataire1@mailtrap.io', 'Tim'); // Destinataire principal
    // CC et BCC
    $mail->addCC('cc1@exemple.com', 'Elena');
    $mail->addBCC('bcc1@exemple.com', 'Alex');
    // Ajout d'autres destinataires en BCC
    $mail->addBCC('bcc2@exemple.com', 'Anna');
    $mail->addBCC('bcc3@exemple.com', 'Mark');

    // Contenu de l'email
    $mail->isHTML(true); // Définir le format d'email en HTML
    $mail->Subject = "Test SMTP PHPMailer";
    $mail->Body = '<h1>Envoyer un email HTML en utilisant SMTP en PHP</h1><p>Ceci est un email test que j\'envoie en utilisant un serveur SMTP avec PHPMailer.</p>'; // Exemple de corps HTML
    $mail->AltBody = 'Ceci est la version texte brut du contenu de l\'email';

    if(!$mail->send()) {
        echo 'Le message n\'a pas pu être envoyé.';
        echo 'Erreur : ' . $mail->ErrorInfo;
    } else {
        echo 'Le message a été envoyé';
    }
} catch (Exception $e) {
    echo "Le message n'a pas pu être envoyé. Erreur : {$mail->ErrorInfo}";
}
?>

Comment envoyer des emails à plusieurs destinataires

Pour envoyer des emails à plusieurs destinataires, vous pouvez utiliser l’extrait de code suivant :

<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = '1a2b3c4d5e6f7g'; //généré par Mailtrap
$mail->Password = '1a2b3c4d5e6f7g'; //généré par Mailtrap
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->SMTPKeepAlive = true; // ajoutez ceci pour garder la connexion SMTP ouverte après chaque email envoyé
$mail->setFrom('liste@exemple.com', 'Gestionnaire de liste');
$mail->Subject = "Nouvelle liste de diffusion Mailtrap";
$users = [
  ['email' => 'max@gmail.com', 'name' => 'Max'],
  ['email' => 'box@exemple.com', 'name' => 'Bob']
];
foreach ($users as $user) {
  $mail->addAddress($user['email'], $user['name']);
  $mail->Body = "<h2>Bonjour, {$user['name']}!</h2> <p>Comment allez-vous ?</p>";
  $mail->AltBody = "Bonjour, {$user['name']}! \n Comment allez-vous ?";
  try {
      $mail->send();
      echo "Message envoyé à : ({$user['email']}) {$mail->ErrorInfo}\n";
  } catch (Exception $e) {
      echo "Erreur d'envoi ({$user['email']}) {$mail->ErrorInfo}\n";
  }
  $mail->clearAddresses();
}
$mail->smtpClose();

Envoyer des emails avec pièces jointes

Pour envoyer des emails avec pièces jointes, vous pouvez :

  • Joindre un fichier depuis votre filesystem

Si vous choisissez cette option, assurez-vous de sauvegarder vos fichiers dans le même répertoire que le script.

Pour joindre un fichier, spécifiez simplement son chemin. Vous pouvez aussi ajouter un nom de fichier, mais c’est facultatif car le script utilisera le nom réel de votre fichier :

$mail->addAttachment('chemin/vers/facture1.pdf', 'facture1.pdf');

Quand vous appelez ce script, PHPMailer joint le fichier situé à chemin/vers/facture1.pdf à l’email. Le second paramètre, facture1.pdf, est optionnel et spécifie le nom du fichier. Pour cet exemple, j’ai utilisé .pdf, mais gardez à l’esprit que vous pouvez aussi ajouter d’autres types de fichiers, comme des images (.jpg ou .png) par exemple.

Pour ajouter un autre fichier, répétez simplement la commande :

$mail->addAttachment('chemin/vers/calcul1.xlsx', 'calcul1.xlsx');
  • Ajouter une pièce jointe sous forme de chaîne

En ajoutant une pièce jointe sous forme de chaîne, vous joignez des données sans avoir à les sauvegarder d’abord comme fichier physique sur votre système. En d’autres termes, les données que vous joignez sont stockées dans une variable. Par exemple, cela vous permet d’extraire un fichier d’une base de données, comme un BLOB (Binary Large Object), sans avoir besoin de le sauvegarder comme fichier.

Pour cela, vous pouvez utiliser la commande suivante :

$mysql_data = $mysql_row['blob_data'];
$mail->addStringAttachment($mysql_data, 'donnees_db.db');

Cet exemple ajoute des données stockées comme BLOB depuis une base de données MySQL.

Vous pouvez aussi utiliser une URL distante, comme ceci :

$mail->addStringAttachment(file_get_contents($url), 'monfichier.pdf');

Envoi d’emails avec images intégrées

Pour envoyer des emails avec des images intégrées, vous pouvez utiliser les pièces jointes CID :

$mail->addEmbeddedImage('chemin/vers/fichier_image.jpg');
$mail->isHTML(true);
$mail->Body = '<img src="cid:image_cid">';

Et voici à quoi cela ressemble dans un extrait de code complet :

<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';

$mail = new PHPMailer(true); // Active les exceptions

$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = 'collez celui généré par Mailtrap';
$mail->Password = 'collez celui généré par Mailtrap';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

$mail->setFrom('de@exemple.com', 'Prénom Nom');
$mail->addReplyTo('aqui@exemple.com', 'John Doe');
$mail->addAddress('destinataire@exemple.com', 'Nom Destinataire'); // Spécifiez le destinataire

$mail->isHTML(true);
$mail->Subject = "Test SMTP PHPMailer";
$mail->addEmbeddedImage('chemin/vers/fichier_image.jpg', 'image_cid'); // Spécifiez le chemin vers votre image et un CID
$mail->Body = '<img src="cid:image_cid"> Corps de l\'email en HTML'; // Utilisez le CID comme attribut src dans votre balise img
$mail->AltBody = 'Ceci est la version texte brut du contenu de l\'email';

if(!$mail->send()){
    echo 'Le message n\'a pas pu être envoyé.';
    echo 'Erreur : ' . $mail->ErrorInfo;
}else{
    echo 'Le message a été envoyé';
}

Le résultat “Le message a été envoyé” vous informe que votre code s’exécute correctement. Pour vérifier le résultat de la livraison et les détails, allez dans votre boîte de réception Mailtrap : vos messages y arriveront en quelques secondes.

Test SMTP PHPMailer

Envoi d’emails asynchrone

Contrairement à Node.js, qui prend en charge les opérations asynchrones, PHPMailer est synchrone par conception. Néanmoins, vous pouvez utiliser la fonction exec() pour appeler un script PHP qui envoie des emails en arrière-plan.

D’abord, installez le PHP CLI (Command Line Interface) puis utilisez le script sendEmail.php suivant :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/vendor/autoload.php'; // Assurez-vous que le chemin est correct

$mail = new PHPMailer(true);

// Configuration SMTP
$mail->isSMTP();
$mail->Host = 'smtp.example.com'; // Spécifiez les serveurs SMTP principal et de backup
$mail->SMTPAuth = true; // Activez l'authentification SMTP
$mail->Username = 'utilisateur@exemple.com'; // Nom d'utilisateur SMTP
$mail->Password = 'secret'; // Mot de passe SMTP
$mail->SMTPSecure = 'tls'; // Activez le cryptage TLS, `ssl` également accepté
$mail->Port = 587; // Port TCP pour la connexion

// Paramètres email
$mail->setFrom('de@exemple.com', 'Mailer');
$mail->addAddress('destinataire@exemple.com', 'Nom du Destinataire'); // Ajoutez un destinataire
$mail->isHTML(true); // Définir le format d'email en HTML
$mail->Subject = 'Voici le sujet';
$mail->Body = 'Ceci est le corps du message HTML <b>en gras</b> !';
$mail->AltBody = 'Ceci est le corps en texte brut pour les fournisseurs de services de messagerie non-HTML';

try {
    $mail->send();
    echo 'Le message a été envoyé';
} catch (Exception $e) {
    echo "Le message n'a pas pu être envoyé. Erreur Mailer : {$mail->ErrorInfo}";
}

Pour exécuter le script, utilisez la commande suivante :

exec("php /path/to/sendEmail.php > /dev/null &");

Notes:

  • Assurez-vous que le chemin vers l’exécutable PHP CLI (php) est correctement spécifié.
    • Dans certains cas et environnements, vous devrez peut-être utiliser le chemin complet vers le binaire CLI (par exemple, /usr/bin/php).
  • Vérifiez la configuration PHP de votre serveur pour vous assurer que les fonctions comme exec() ne sont pas désactivées, car elles le sont souvent dans les environnements d’hébergement partagés pour des raisons de sécurité.
    • La directive qui contrôle cela est la directive disable_functions dans php.ini.

Comment envoyer des emails en masse

Pour envoyer des emails à de nombreux destinataires simultanément dans PHPMailer, j’utilise les identifiants du Bulk Stream de Mailtrap.

Vous pouvez les trouver après vous être connecté à votre compte Mailtrap et avoir navigué vers Sending DomainsSMTP/API Settings tab. Sur la droite, vous devriez voir les identifiants du Transactional Stream.

Ensuite, insérez simplement les identifiants dans le script suivant pour l’envoi d’emails en masse :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Chemin d'accès au fichier autoload de Composer

$mail = new PHPMailer(true);

try {
    // Paramètres du serveur
    $mail->isSMTP();
    $mail->Host       = 'bulk.smtp.mailtrap.io'; // Définir le serveur SMTP pour l'envoi
    $mail->SMTPAuth = true; // Activer l'authentification SMTP
    $mail->Username = 'votre_nom_utilisateur_smtp'; // Nom d'utilisateur SMTP
    $mail->Password = 'votre_mot_de_passe_smtp'; // Mot de passe SMTP
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Activer le cryptage TLS
    $mail->Port = 587; // Port TCP pour la connexion


    // Adresse d'expéditeur et de réponse
    $mail->setFrom('de@exemple.com', 'Mailer');
    $mail->addReplyTo('repondrea@exemple.com', 'Mailer');

    // Contenu
    $mail->isHTML(true); // Définir le format d'email en HTML
    
    // Liste des destinataires
    $recipients = [
        ['email' => 'personne1@exemple.com', 'name' => 'Personne Un'],
        ['email' => 'personne2@exemple.com', 'name' => 'Personne Deux'],
        // Ajoutez plus de destinataires si nécessaire
    ];

    foreach ($recipients as $recipient) {
        $mail->addAddress($recipient['email'], $recipient['name']); // Ajouter un destinataire

        // Personnaliser le message
        $mail->Subject = 'Voici le sujet';
        $mail->Body    = 'Ceci est le corps du message HTML <b>en gras</b> !';
        $mail->AltBody = 'Ceci est le corps en texte brut pour les fournisseurs de services de messagerie non-HTML';

        $mail->send();
        $mail->clearAddresses(); // Effacer les adresses pour la prochaine itération
    }

    echo 'Les messages ont été envoyés';
} catch (Exception $e) {
    echo "Le message n'a pas pu être envoyé. Erreur Mailer : {$mail->ErrorInfo}";
}

Ce script vous permet d’envoyer des emails à plusieurs destinataires sans ouvrir et fermer la connexion SMTP pour chaque mail, ce qui est beaucoup plus efficace que de créer une nouvelle instance PHPMailer pour chaque email, par exemple.

Cependant, si vous prévoyez d’envoyer un grand volume d’emails, vous voudrez peut-être utiliser un système de file d’attente comme RabbitMQ, Beanstalkd, Redis, ou autres.

À titre d’exemple, je vais vous montrer comment le faire avec RabbitMQ.

Mais d’abord, installons une bibliothèque PHP via Composer :

composer require php-amqplib/php-amqplib

Ensuite, le script producteur de tâches publiera les emails dans une file d’attente RabbitMQ :

require 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'user', 'password');
$channel = $connection->channel();

$channel->queue_declare('emailQueue', false, true, false, false);

$emailData = [
    'email' => 'destinataire@exemple.com',
    'subject' => 'Email Test',
    'body' => 'Ceci est le corps d'un email test.'
];

$msg = new AMQPMessage(json_encode($emailData), ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'emailQueue');

echo " [x] Envoyé 'Tâche Email'\n";

$channel->close();
$connection->close();

Et enfin, le script worker consommera les messages de la file d’attente et enverra les emails :

require 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTPException;

$connection = new AMQPStreamConnection('localhost', 5672, 'user', 'password');
$channel = $connection->channel();

$channel->queue_declare('emailQueue', false, true, false, false);

echo " [*] En attente de messages. Pour quitter appuyez sur CTRL+C\n";

$logFile = 'email_log.txt'; // Chemin vers votre fichier de log

$callback = function ($msg) use ($logFile) {
    echo " [x] Reçu ", $msg->body, "\n";
    $emailData = json_decode($msg->body, true);

    $mail = new PHPMailer(true);
    try {
        // Configuration des paramètres SMTP
        $mail->isSMTP();
        // Votre configuration SMTP ici

        $mail->setFrom('de@exemple.com', 'Mailer');
        $mail->addAddress($emailData['email']); // Email du destinataire depuis les données de la tâche

        $mail->isHTML(true); // Format d'email en HTML
        $mail->Subject = $emailData['subject'];
        $mail->Body    = $emailData['body'];

        $mail->send();
        echo "Email envoyé à {$emailData['email']}\n";
        
        // Journal d'envoi d'email réussi
        file_put_contents($logFile, "Email envoyé avec succès à {$emailData['email']} le " . date('Y-m-d H:i:s') . "\n", FILE_APPEND);
    } catch (Exception $e) {
        echo "L'email n'a pas pu être envoyé. Erreur Mailer : {$mail->ErrorInfo}\n";
        // Journal des erreurs générales
        file_put_contents($logFile, "Échec d'envoi d'email à {$emailData['email']} le " . date('Y-m-d H:i:s') . ". Erreur : {$mail->ErrorInfo}\n", FILE_APPEND);
    } catch (SMTPException $e) {
        echo "Erreur SMTP : {$mail->ErrorInfo}\n";
        // Journal des erreurs SMTP spécifiques
        file_put_contents($logFile, "Erreur SMTP lors de l'envoi d'email à {$emailData['email']} le " . date('Y-m-d H:i:s') . ". Erreur : {$mail->ErrorInfo}\n", FILE_APPEND);
    }

    $msg->ack();
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume('emailQueue', '', false, false, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();

Conseils :

  • Remplacez les valeurs d’exemple comme localhost, 5672, user, password, et emailQueue par vos véritables détails RabbitMQ et nom de file d’attente.
  • Considérez également un gestionnaire de processus comme Supervisor pour vous assurer que votre script worker s’exécute toujours et redémarre automatiquement en cas de crash.
  • Le script worker nécessite vos détails de configuration SMTP spécifiques ; dans ce cas, ce sont vos identifiants Bulk Stream.

Débogage PHPMailer

Si vous rencontrez des problèmes lors de l’envoi d’emails via un serveur SMTP, la commande SMTPDebug vous aidera à explorer ces erreurs et à découvrir ce qui doit être corrigé.

Activez le débogage SMTP et définissez le niveau de débogage dans votre script comme suit :

$mail->SMTPDebug = 2;
  • niveau 1 = client ; affichera les messages envoyés par le client
  • niveau 2 = client et serveur ; ajoutera les messages du serveur, c’est le paramètre recommandé
  • niveau 3 = client, serveur et connexion ; ajoutera des détails sur les informations initiales, ce qui peut être utile pour découvrir les échecs STARTTLS
  • niveau 4 = informations de bas niveau

Exemple 1. Nom d’hôte SMTP invalide

2018-12-12 14:51:32	Connection: opening to mailtrap.io:587, timeout=10, options=array()
2018-12-12 14:51:42	Connection failed. Error #2: stream_socket_client(): unable to connect to mailtrap.io:587 (Operation timed out) [/Users/xxxx/Downloads/PHPMailer/src/SMTP.php line 326]
2018-12-12 14:51:42	SMTP ERROR: Failed to connect to server: Operation timed out (60)
2018-12-12 14:51:42	SMTP connect() failed.

Pour cet exemple, j’ai entré un nom d’hôte invalide : mailtrap.io au lieu de live.smtp.mailtrap.io. et j’ai instantanément reçu un message indiquant qu’une erreur s’était produite dès la première étape de communication avec le serveur.

Exemple 2. Identifiants invalides

2018-12-12 14:49:26	Connection: opening to live.smtp.mailtrap.io:587, timeout=300, options=array()
2018-12-12 14:49:26	Connection: opened
2018-12-12 14:49:26	SMTP INBOUND: "220 mailtrap.io ESMTP ready"
2018-12-12 14:49:26	SERVER -> CLIENT: 220 mailtrap.io ESMTP ready
...
2018-12-12 14:49:30	SMTP INBOUND: "535 5.7.0 Invalid login or password"
2018-12-12 14:49:30	SERVER -> CLIENT: 535 5.7.0 Invalid login or password
2018-12-12 14:49:30	SMTP ERROR: Username command failed: 535 5.7.0 Invalid login or password
2018-12-12 14:49:30	SMTP Error: Could not authenticate.
2018-12-12 14:49:30	CLIENT -> SERVER: QUIT
2018-12-12 14:49:30	SMTP INBOUND: "221 2.0.0 Bye"
2018-12-12 14:49:30	SERVER -> CLIENT: 221 2.0.0 Bye
2018-12-12 14:49:30	Connection: closed
2018-12-12 14:49:30	SMTP connect() failed.
Mailer Error: SMTP connect() failed.

Ici, je montre où se produit l’erreur : maintenant le SMTP, son nom d’hôte et son port sont valides, mais une combinaison de login et mot de passe n’a pas été trouvée, vous devez donc vérifier et modifier vos identifiants.

Il existe quelques articles détaillés sur GitHub concernant le débogage et le dépannage, consultez-les lorsque vous devez approfondir ces sujets. Et si vous voyez la célèbre erreur SMTP Error: Could not connect to SMTP host, il existe une section dédiée pour résoudre ce problème.

Testez vos emails et leur envoi dans un environnement de staging

Envoyer vos emails sans les tester au préalable serait comme partir en voyage sans vérifier si vous avez bien tout mis dans votre valise. Imaginez-vous à l’aéroport pour vous rendre compte que vous avez oublié votre passeport à l’enregistrement. 🛂

Quelque chose de similaire peut arriver à vos emails si vous ne les testez pas avant de les envoyer. Par exemple, ils pourraient ne pas arriver dans les boîtes de réception ou être marqués comme spam, votre HTML pourrait ne pas être correctement rendu par tous les fournisseurs de services de messagerie, vos variables de personnalisation pourraient être incorrectes, etc.

Heureusement, nous avons la solution avec l’outil holistique Email Testing de Mailtrap.

L’Email Testing de Mailtrap vous permet de capturer le trafic des environnements de staging et de développement, puis de les prévisualiser et d’analyser leur HTML/CSS avant de les envoyer.

Fonctionnalité de vérification HTML de l’Email Testing de Mailtrap

Il y a aussi le Rapport de Spam, qui peut vous aider à résoudre les problèmes potentiels de délivrabilité des emails si vous maintenez votre score de spam en dessous de 5.

Fonctionnalité d'analyse de spam de l’Email Testing de Mailtrap

Cela dit, laissez-moi vous montrer comment ça fonctionne.

Pour tester vos emails avec un serveur SMTP fictif, allez dans Email TestingInboxesSMTP Settings et sélectionnez PHPMailer dans la liste des Intégrations.

Identifiants SMTP de l’Email Testing de Mailtrap

Ensuite, collez simplement les paramètres dans votre script PHPMailer, qui devrait ressembler à ceci :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$phpmailer = new PHPMailer(true); //  Créer une nouvelle instance PHPMailer

try {
    // Paramètres SMTP pour Mailtrap
    $phpmailer->isSMTP(); // Configurer le mailer pour utiliser SMTP
    $phpmailer->Host = 'sandbox.smtp.mailtrap.io'; // Spécifier les serveurs SMTP principal et de backup
    $phpmailer->SMTPAuth = true; // Activer l'authentification SMTP
    $phpmailer->Username = '1234567891234'; // Nom d'utilisateur SMTP
    $phpmailer->Password = '1234567891234'; // Mot de passe SMTP
    $phpmailer->Port = 587; // Port TCP pour la connexion

    // Paramètres du contenu de l'email
    $phpmailer->setFrom('votre_email@exemple.com', 'Mailer');
    $phpmailer->addAddress('destinataire@exemple.com', 'Joe User'); // Ajouter un destinataire
    $phpmailer->isHTML(true); // Définir le format d'email en HTML
    $phpmailer->Subject = 'Voici le sujet';
    $phpmailer->Body    = 'Ceci est le corps du message HTML <b>en gras</b> !';
    $phpmailer->AltBody = 'Ceci est le corps en texte brut pour les fournisseurs de services de messagerie non-HTML';

    $phpmailer->send(); // Envoyer l'email
    echo 'Le message a été envoyé';
} catch (Exception $e) {
    echo "Le message n'a pas pu être envoyé. Erreur Mailer : {$phpmailer->ErrorInfo}";
}
?>

Conseil pro :

  • Vous pouvez également utiliser les identifiants SMTP de Mailtrap pour tester les emails avec PHPMailer sur localhost et obtenir des fonctionnalités supplémentaires.

Conclusion

Dans ce tutoriel, j’ai couvert les cas d’utilisation les plus courants de PHPMailer, de la création d’emails HTML avec images et pièces jointes, à leur envoi avec ou sans SMTP, et plus encore !

J’espère que vous pourrez utiliser cet article comme guide de référence pour ajouter des fonctionnalités email à votre application.

Cependant, si vous recherchez d’autres cas d’utilisation, jetez un œil au dossier “examples” dans la documentation PHPMailer sur Github, ou consultez notre blog, où vous pouvez trouver des articles tels que :

De plus, si vous apprenez mieux visuellement, n’oubliez pas de consulter notre chaîne YouTube et voir comment envoyer des emails en utilisant PHP !

Article by Dmitriy Shcherbakan Full Stack Developer @Railsware
Ivan Djuric, an author at Mailtrap
Article by Ivan Djuric Technical Content Writer @Mailtrap

I’m a Technical Content Writer with 5 years of background covering email-related topics in tight collaboration with software engineers and email marketers. I just love to research and share actionable insights with you about email sending, testing, deliverability improvements, and more. Happy to be your guide in the world of emails!