<?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
)
);
}*/
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é.
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 devisLoaou 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é !