Steve TENZA
Intervient pour votre site internet
Facebook Me contacter Cookie
Télécharger
Noter:
Ajouté/Modifié le 2025-06-26
Visionné 1839 fois

Envoyer mail avec PHPMailer (avec ou sans SMTP)

Description

PHPMailer, cette bibliothèque PHP populaire et complète permet d'envoyer des emails de manière simple et sécurisée. Dans ce tutoriel, je vous explique comment le configurer pour envoyer des emails via SMTP, ainsi que sans SMTP, et profiter d'une infrastructure d'envoi d'email fiable.

Ce tuto est divisé en trois parties :

1. Formulaire de contact avec PHPMailer (formulaire_contact.php)

J'ai mis un formulaire HTML pour envoyer un message via PHPMailer. Avant d'envoyer l'email, il est important de vérifier que les champs soient correctement remplis et que l'adresse email du destinataire soit valide. Un exemple de vérification d'adresse est disponible dans ce tutoriel. Un autre tuto utile pour vérifier les champs du formulaire se trouve ici.

2. Configurez l'envoi d'email avec PHPMailer (phpmailer.php)

Le fichier phpmailer.php centralise la logique d'envoi d'email où vous pouvez configurer PHPMailer pour envoyer des emails via un serveur SMTP ou bien l'utiliser sans serveur SMTP pour envoyer des emails directement depuis votre serveur web ou votre hébergement.

Mettez votre email et votre nom à 'sender' et 'sender_name'
C'est l'email qui recevra les emails envoyés depuis votre site

Utilisation de PHPMailer avec ou sans SMTP


💡 Pourquoi utiliser un serveur SMTP professionnel ?

Lorsque vous utilisez PHPMailer, vous avez la possibilité d'envoyer des emails via un serveur SMTP "verified" qui permet de garantir que vos emails arrivent dans les boîtes de réception des destinataires et non dans les dossiers SPAMS. Un serveur SMTP fiable est essentiel pour gérer efficacement vos envois, et si vous prévoyez d'envoyer un grand nombre d'emails, comme dans le cas de newsletters ou d'emails transactionnels.

L'un des services SMTP recommandés est Brevo, une plateforme qui permet d'envoyer des emails avec un excellent taux de délivrabilité. Si vous recherchez une solution professionnelle pour vos envois d'emails, il peut être judicieux d'explorer cette option. L'intégration avec PHPMailer est simple, et vous pouvez commencer à envoyer des emails en quelques étapes seulement. De plus, si vous n'avez pas encore de fournisseur SMTP, Brevo offre un service fiable, flexible et une offre gratuite permettant d'envoyer jusqu'à 300 emails par jour, soit plus de 8000 emails par mois ! Pros et particuliers peuvent l'utiliser.

3. Envoi de newsletters en boucle (newsletter.php)

Si vous souhaitez envoyer des newsletters à plusieurs destinataires, la page newsletter.php permet d'envoyer un email à chaque contact de votre liste.

Sans plus tarder, le code source !

Télécharger le pack complet (MAJ 2025)
(Téléchargé 101 fois)


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


//j'ai créé une variable CONFIG_PHPMAILER pour que vous puissiez configurer facilement PHPMailer
$CONFIG_PHPMAILER = [

//mettez votre email principal qui recevra les emails et son nom associé ("De : xxxxx <email>")
'sender' => 'votre-email@example.com',
'sender_name' => 'Votre nom',

//SMTP

//si vous utilisez des paramètres SMTP pour envoyer vos emails (true/false)
//Chez Brevo, vos ID sont ici : https://app.brevo.com/settings/keys/smtp (vous remarquerez que le port indiqué est 587 mais 2525 fonctionnera plus simplement, autrement il vous faudra configurer l'encryption TLS qui peut ne pas fonctionner correctement sur votre hébergement)
'SMTP' => false,
'SMTP_host' => '',
'SMTP_username' => '',
'SMTP_password' => '',
'SMTP_port' => 2525,

// Debug output level.
// Options:
// 0 : No debug output, default
// 1 : Client commands
// 2 : Client commands and server responses
// 3 : As DEBUG_SERVER plus connection status
// 4 : Low-level data output, all messages.
'SMTP_debug' => 0,


//EXCEPTIONS

//activer les exceptions (true/false)
'debug' => false,

//langues disponibles pour les messages d'erreurs
'language' => 'fr',

//encodage UTF-8 pour éviter que les caractères spéciaux comme "é" deviennent "é"
'CharSet' => 'UTF-8',

];


require __DIR__ .'/src/Exception.php';
require __DIR__ .'/src/PHPMailer.php';

$PHPMailer = new PHPMailer($CONFIG_PHPMAILER['debug'] ? true : null);
$PHPMailer->setLanguage($CONFIG_PHPMAILER['language']);
$PHPMailer->CharSet = $CONFIG_PHPMAILER['CharSet'];

//envoyer en utilisant SMTP
if($CONFIG_PHPMAILER['SMTP']){

require __DIR__ .'/src/SMTP.php';

$PHPMailer->SMTPSecure = $CONFIG_PHPMAILER['SMTP_host'] == 587
//Activer le cryptage TLS implicite si 587
? PHPMailer::ENCRYPTION_STARTTLS
//Désactiver le cryptage TLS si autre
: '';

$PHPMailer->isSMTP();
$PHPMailer->SMTPAuth = true;
$PHPMailer->Host = $CONFIG_PHPMAILER['SMTP_host'];
$PHPMailer->Username = $CONFIG_PHPMAILER['SMTP_username'];
$PHPMailer->Password = $CONFIG_PHPMAILER['SMTP_password'];
$PHPMailer->Port = $CONFIG_PHPMAILER['SMTP_port'];


}


//CONTENU DU MESSAGE

//Nous préparons le mesage ici (dans cette page) pour que nous ayons pas à le faire à chaque fois qu'on envoi un email

//informer que nous utilisons du HTML
$PHPMailer->isHTML(true);
$PHPMailer->AltBody = "Il s'agit du corps du message en texte clair pour les clients de messagerie qui ne supporte pas HTML.";

//nom et email de la personne qui envoi les emails (vous pouvez très bien utiliser setFrom() au moment de l'envoi pour définir un autre envoyeur)
$PHPMailer->setFrom($CONFIG_PHPMAILER['sender'], $CONFIG_PHPMAILER['sender_name']);


//FONCTION POUR FACILITER L'ENVOI DES EMAILS
/**
* Envoie un email avec PHPMailer
*
* @param array $destinataire Tableau contenant l'adresse et le nom du destinataire.
* Exemple : ['adresse@example.com', 'Nom du destinataire'].
* @param string $titre Le titre (ou sujet) de l'email.
* @param string $contenu Le contenu (corps) de l'email.
* @param array $replyto (Optionnel) Tableau contenant l'adresse et le nom de la personne
* à qui répondre en cas de clic sur "Répondre" dans le webmail.
* Exemple : ['adresse-reponse@example.com', 'Nom du répondant'].
* Si vide ou false, l'adresse définie dans setFrom() sera utilisée.
*
* @return bool Retourne true si l'email a été envoyé avec succès, false sinon.
*
* @example envoyerMail(
* ['adresse-destinataire@example.com', 'Nom du destinataire'],
* "Titre de l'email",
* "Contenu de l'email",
* ['adresse-destinataire-retour@example.com', 'Nom du destinataire retour']
* );
*/
function envoyerMail($destinataire, $titre, $contenu, $replyto = []): bool{

global $PHPMailer;

//ajout du destinataire
$PHPMailer->addAddress($destinataire[0], $destinataire[1] ?? false);

//ajout d'une adresse de réponse
if(count($replyto) > 0)
$PHPMailer->addReplyTo($replyto[0], $replyto[1] ?? false);

//définit le titre du mail
$PHPMailer->Subject = $titre;

//définit son contenu
//nl2br() ajoutera un <br> à chaque saut de ligne, le paramètre nl2br à false sert à avoir un <br> et non un <br />
$contenu = '<!DOCTYPE HTML>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Email</title>
</head>
<body>
' . nl2br($contenu, false) . '
</body>
</html>';
$PHPMailer->msgHTML($contenu);

try{

//envoi du mail
$PHPMailer->send();

//clearAddresses() permet de supprimer le 1er destinaire dans les cas d'envoi en masse (newsletter), sinon le prochain destinataire aura en CC le 1er destinataire, puis le 3ème aura les deux premiers, etc...)
$PHPMailer->clearAddresses();

return true;

}catch(Exception $e){

if($CONFIG_PHPMAILER['debug'])
echo "Message could not be sent. Mailer Error: {$PHPMailer->ErrorInfo}";

//Réinitialiser la connexion pour interrompre l'envoi de ce message
//La boucle continuera à essayer d'envoyer le message au reste de la liste
if($PHPMailer->SMTPKeepAlive === true)
$PHPMailer->getSMTPInstance()->reset();

$PHPMailer->clearAddresses();

return false;
}

}


<?php
require_once __DIR__ . '/phpmailer.php';

//page HTML classique pour la démonstration

?><!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Formulaire de Contact</title>
</head>
<body>

<h1>Contactez-nous</h1>

<?php
//vérification des champs envoyés
//faite une vérification de l'adresse email que l'utilisateur, assurez-vous qu'elle en soit une (vous pouvez regarder mon tuto à ce sujet : https://www.c2script.com/scripts/verifier-une-adresse-mail-en-php-s2.html)
//assurez-vous également que tous les champs sont bien remplis, vous pouvez voir ce tuto pour créer un formulaire de contact qui vérifie les champs : https://www.c2script.com/scripts/formulaire-de-contact-php-s6.html)

if(isset($_POST['nom'], $_POST['mail'], $_POST['message'])){

$envoyerMail = envoyerMail(

//votre email et nom
[$CONFIG_PHPMAILER['sender'], $CONFIG_PHPMAILER['sender_name']],

//titre du mail
"Nouveau message depuis le formulaire de contact",

//contenu du mail
$_POST['message'],

//son email et son nom en pramètres "replyto"
[$_POST['mail'], $_POST['nom']]
);

if(!$envoyerMail)
echo "Une erreur s'est produite, merci de réessayer";
else
echo "Le message a bien été envoyé !";

}
?>


<form action="" method="POST">
<div>Nom :</div>
<input type="text" name="nom" placeholder="Votre nom" required>

<div>Email :</div>
<input type="email" name="mail" placeholder="Votre email" required>

<div>Message :</div>
<textarea name="message" rows="5" cols="40" placeholder="Votre message" required><?= "Message de test avec émojis et acents et sauts de ligne 🎉💥✉️ !\n\nÀ bientôt l'équipe 👋😊" ?></textarea>

<input type="submit" value="Envoyer">
</form>

</body>
</html>


<?php
require_once __DIR__ . '/phpmailer.php';

//garder la connexion SMTP ouverte pour éviter de la réouvrir et la fermer à chaque envoi
$PHPMailer->SMTPKeepAlive = true;

//configurez un titre et un contenu
$titre_news = "Découvrez nos dernières nouveautés et offres exclusives !";
$contenu_news = "Bonjour {{nom_prenom}},

Ravis de vous présenter les dernières nouveautés de notre boutique ! Voici quelques-uns de nos produits les plus populaires :

<ul>
<li><strong>Produit A</strong> : 10% de réduction avec le code PROMO10.</li>
<li><strong>Produit B</strong> : Livraison gratuite sur toutes les commandes.</li>
<li><strong>Produit C</strong> : Découvrez notre nouvelle collection printemps/été !</li>
</ul>

Profitez-en dès aujourd'hui !

À très bientôt !";

//allez chercher vos emails là où ils sont (ici pour l'exemple, j'utilise un tableau, vous pouvez les récupérer depuis une base de données MySQL, le processus est quasiment le même ; faire une boucle et utiliser la fonction envoyerMail(), voir : https://www.c2script.com/scripts/newsletter_cron-gestion-simple-d-envoi-de-newsletter-s49.html)

//bon, évidement, ne faites pas l'envoi avec les adresses ci-dessous, cela va de soi ! :)
//(plus bas, retrouvez un exemple avec le nom et prénom de l'utilisateur)

$vos_emails = [
'alice.smith@example.com',
'bob.johnson@example.com',
'carol.white@example.com',
'david.brown@example.com',
];

foreach($vos_emails as $mail){

$envoyerMail = envoyerMail(
[$mail],
$titre_news,
$contenu_news
);

if(!$envoyerMail)
echo "<p>Une erreur s'est produite avec $mail.</p>";
else
echo "<p>Le message a bien été envoyé à $mail !</p>";

//fait une pause d'une seconde pour pas envoyer tout d'un coup
sleep(1);

}


//démo avec prénom et nom

/*$vos_emails = [
'alice.smith@example.com' => 'Alice SMITH',
'bob.johnson@example.com' => 'Bob JOHNSON',
'carol.white@example.com' => 'Carol WHITE',
'david.brown@example.com' => 'David BROWN',
];

foreach($vos_emails as $mail => $nom_prenom){

envoyerMail(
[$mail, $nom_prenom],
$titre_news,
str_replace(
'{{nom_prenom}}',
$nom_prenom,
$contenu_news
)
);

}*/




Conclusion

PHPMailer est une solution idéale pour l'envoi d'emails en PHP, qu'il s'agisse d'un envoi unique ou de campagnes massives, il permet également de joindre facilement des pièces jointes. En utilisant un service SMTP professionnel, vous bénéficiez d'une infrastructure de qualité qui garantit une meilleure délivrabilité. ✉️

J'espère que ce script gratuit vous est utile.
Pour soutenir mon travail, un simple don ou mettre une note est grandement apprécié.
Votre réussite en ligne commence ici

Vous cherchez à pousser encore plus loin vos idées ou à les concrétiser avec un site internet sur mesure ? Je suis là pour vous aider ! Mon expérience en développement web est à votre disposition.

Que ce soit la création de votre site web pro ou l'apport de fonctionnalités avancées à votre projet, contactez-moi pour en discuter et avoir un devis gratuit personnalisé.

Mon objectif est de vous offrir des solutions sur mesure qui répondent à vos besoins, et votre vision associée à mon expertise donnera vie à votre projet web parfait. Contactez-moi aujourd'hui, je réponds en général en moins d'une heure :

Demander un devis
Réponse rapide !

Vous recherchez un script précis ?

Dites-moi ce dont vous avez besoin, je peux développer le script demandé et vous envoyer un mail dès qu'il est dispo !

🔔 Vous pouvez laisser votre mail pour recevoir les nouveaux scripts. Pas de pub, pas de tracas. Vous êtes libre de le supprimer à tout moment.

Je prends en compte toutes les demandes. Les idées les plus populaires passent en priorité et seront publiées dès qu'elles seront prêtes. 2874 demandes reçues.

Si vous avez un projet en tête, je vous suggère de me contacter directement pour en discuter.

Commentaires

Ajouter un commentaire

Commenter
Pseudo/Nom
Email
Message
Captcha
memo1
Commenter

Loaou le 24 Juin 2025 à 11:52

Dans PhpMailer, ligne 59, je pense que ce n'est pas $CONFIG_PHPMAILER['SMTP'] qui devrait figurer, mais $CONFIG_PHPMAILER['SMTP_port']

admin le 26 Juin 2025 à 13:31

Merci pour votre commentaire.
Merci pour cette correction, je m'en était pas rendu compte car je fais avec SMTP.
Le script est corrigé !

Retour à la liste des scripts

Un site à créer ?
Contactez-moi