faire une newsletter
- Accueil
- Forum
- Programmation
- PHP
- faire une newsletter
jeannot_gates Le 10 juin 2016 à 14:57 (Édité le 25 janvier 2019 à 17:51)
Ranarxhag Le 10 juin 2016 à 18:21 (Édité le 12 juin 2016 à 01:00)
En premier lieu, dans ta base de donnée, tu crées une table "newsletter" qui contiendra 2 colonnes :
- id (en auto-increment. Il me semble qu'il est presque obligé d'avoir un champ en auto-increment)
- mail (varchar)
Ensuite, tu crées le formulaire (design au choix évidemment) :
<form method="post" action="">
<input type="mail" name="newslettermail" />
<input type="submit" name="submitnewsletter" value="OK" />
</form>
Quand la personne indique son adresse mail et clique sur OK, c'est une simple insertion en base de donnée :
if(isset($_POST['submitnewsletter'])) {
if(filter_var($_POST['newslettermail'], FILTER_VALIDATE_EMAIL)) { // On vérifie si l'adresse e-mail a un format valide
$insertmail = $bdd->prepare('INSERT INTO newsletter(mail) VALUES(?)');
$insertmail->execute(array($_POST['newslettermail']));
$success = "Merci de vous être inscrit à la newsletter !";
}
else
{
$erreur = "Le format de l'adresse e-mail n'est pas valide !";
}
}
Ensuite, de ton côté, pour envoyer un mail à toutes les adresses enregistrées de façon dynamique, tu procèdes de la manière suivante :
En HTML, tu crées le petit formulaire d'envoi :
<form method="post" action="la_page_de_traitement.php">
<label>Envoyer un mail à toutes les adresses</label>
<textarea name="newsletterMessage"></textarea>
<input type="submit" name="newsletterSend" value="Envoyer le mail" />
</form>
En PHP, tu envoies le mail :
$selectmail = $bdd->prepare('SELECT mail FROM newsletter');
$selectmail->execute();
// Envoi de l'email
$header="MIME-Version: 1.0\r\n";
$header.='From: "tonsite.com"<no-reply@tonsite.com>'."\n";
$header.='Content-Type:text/html; charset="utf-8"'."\n";
$header.='Content-Transfet-Encoding: 8bit';
while($affichmail = $selectmail->fetch()) {
$mail[] = $affichmail['mail'];
}
$destinataires = implode(',', $mail);
mail($destinataires, "Objet du mail", $_POST['newsletterMessage'], $header);
Et ça y est ! Tes mail sont envoyé à bonne destination pour chaque membre inscrit à la newsletter.
Evidemment, c'est un petit truc de base que j'ai fais pour que tu vois comment mettre ton petit système en place et à quoi ça ressemble.
D'autres auront peut-être une manière différente de faire mais en tout cas, celle-ci, c'est la mienne 😉
J'espère t'avoir aidé !
Ranarxhag
EDIT : J'ai corrigé toutes les erreurs.. c'était horrible 😮
joris1904 Le 10 juin 2016 à 22:59 (Édité le 1 janvier 1970 à 01:00)
$insertmail = $bdd->prepare('INSERT INTO newsletter(mail) VALUES(?));
$insertmail->execute(array($_POST['newslettermail));
car sa me sort sa comme erreur :
Fatal error: Call to a member function prepare() on a non-object in /home/u258251883/public_html/v2/index.php on line 284
pourrait tu la corrigé s'il te plait 😀
(petit info j'utilise ton code )
Ranarxhag Le 11 juin 2016 à 00:46 (Édité le 1 janvier 1970 à 01:00)
J'ai corrigé maintenant, désolé 😰 :)
joris1904 Le 11 juin 2016 à 06:54 (Édité le 11 juin 2016 à 07:05)
if(isset($_POST['submitnewsletter'])) {
if(filter_var($_POST['newslettermail'], FILTER_VALIDATE_EMAIL)) { // On vérifie si l'adresse e-mail a un format valide
var_dump($_POST['newslettermail']);
$insertmail = $bdd->prepare('INSERT INTO newsletter (mail) VALUES(?)');
$insertmail->execute(array($_POST['newslettermail']));
$success = "Merci de vous être inscrit à la newsletter !";
}
else
{
$erreur = "Le format de l'adresse e-mail n'est pas valide !";
}
}
et la sa fonctionnera niquel 😀 😀 😀 joris1904 Le 11 juin 2016 à 20:00 (Édité le 1 janvier 1970 à 01:00)
joris1904 Le 11 juin 2016 à 21:33 (Édité le 1 janvier 1970 à 01:00)
Warning: mail() expects parameter 1 to be string, array given in /home/u258251883/public_html/v2/envoietraitement.php on line 14
eziom Le 11 juin 2016 à 23:06 (Édité le 1 janvier 1970 à 01:00)
joris1904 Le 11 juin 2016 à 23:18 (Édité le 1 janvier 1970 à 01:00)
Ranarxhag Le 11 juin 2016 à 23:29 (Édité le 12 juin 2016 à 00:59)
Il ne faut pas faire une boucle ! J'ai repris un code à moi permettant de faire une newsletter et ce n'est pas du tout comme je me souvenais 😄
Reprenons ce code (qui est faux) :
$selectmail = $bdd->prepare('SELECT * FROM newsletter');
$selectmail->execute();
// Envoi de l'email
$header="MIME-Version: 1.0\r\n";
$header.='From: "tonsite.com"<no-reply@tonsite.com>'."\n";
$header.='Content-Type:text/html; charset="utf-8"'."\n";
$header.='Content-Transfet-Encoding: 8bit';
while($mail = $selectmail->fetch()) {
mail($mail, "Objet du mail", $_POST['newsletterMessage'], $header);
} // Là, on fait une boucle qui va envoyer le mail à chaque résultat qui nous a été reçu, soit la variable $mail
et modifions-le ainsi :
$selectmail = $bdd->prepare('SELECT mail FROM newsletter');
$selectmail->execute();
$mail = $selectmail->fetch();
// Envoi de l'email
$header="MIME-Version: 1.0\r\n"
$header.='From: "tonsite.com"<no-reply@tonsite.com>'."\n";
$header.='Content-Type:text/html; charset="utf-8"'."\n";
$header.='Content-Transfet-Encoding: 8bit';
$destinataires = implode(',', $mail);
mail($destinataires, "Objet du mail", $_POST['newsletterMessage'], $header);
Je vous explique. Le résultat $mail est retourné sous forme de tableau contenant tous les mail (récupérés depuis la BDD). Du coup, on fait un implode() - doc - qui va concaténer chaque élément du tableau en une chaine de caractère avec une virgule après chaque élément.
On fait ensuite UN seul mail() avec la variable $destinataires qui contient tous les emails.
Vraiment désolé de vous avoir donné une fausse info.. Je sais pas trop d'où je l'ai sortie.. 😄
(quelqu'un aurait un code pour éviter que l'on ne puisse pas mettre plusieurs fois l'adresse @mail dans la bdd ?)
@joris1904 c'est simple. Reprenons le code pour l'insertion en BDD et ajoutons une petite vérification comme ceci :
if(isset($_POST['submitnewsletter'])) {
if(filter_var($_POST['newslettermail'], FILTER_VALIDATE_EMAIL)) { // On vérifie si l'adresse e-mail a un format valide
$selectmail = $bdd->prepare('SELECT mail FROM newsletter WHERE mail = ?');
$selectmail->execute(array($_POST['newslettermail']));
$mailexist = $selectmail->fetch();
if(!$mailexist) { // On vérifie si le résultat vaut false et si oui, le mail n'est pas enregistré en BDD et on continue
$insertmail = $bdd->prepare('INSERT INTO newsletter(mail) VALUES(?)');
$insertmail->execute(array($_POST['newslettermail']));
$success = "Merci de vous être inscrit à la newsletter !";
}
else
{
$erreur = "Cette adresse e-mail est déjà enregistrée";
}
}
else
{
$erreur = "Le format de l'adresse e-mail n'est pas valide !";
}
}
IMPORTANT : J'ai edit mon premier post pour corriger toutes les erreurs.. ! Désolé encore 😄
TheOldNoob Le 11 juin 2016 à 23:36 (Édité le 1 janvier 1970 à 01:00)
Pour ma part, voilà a quoi ça ressemble quand je fait une vérification pour un mail qui existe déjà.
Je te code pas ce dont tu a besoin, c'est donc a toi d'adapté (sinon, tu progressera jamais 😉 )
if(empty($post['email']) || !filter_var($post['email'], FILTER_VALIDATE_EMAIL)){
$errors[] = 'Veuillez entrer un email valide SVP';
}
else {
// Verifie que l'email n'est pas dans la base de donnée
$reqEmail = $bdd->prepare('SELECT email FROM users WHERE email = :email');
$reqEmail->bindValue(':email', $post['email']);
$reqEmail->execute();
// Si $reqEmail renvoie une valeur = 0 alors insere les contacts dans la bdd
if($reqEmail->rowCount() != 0){
$errors[] = 'L\'email existe déjà !';
}
}
joris1904 Le 11 juin 2016 à 23:44 (Édité le 1 janvier 1970 à 01:00)
joris1904 Le 11 juin 2016 à 23:55 (Édité le 1 janvier 1970 à 01:00)
Ranarxhag Le 12 juin 2016 à 00:59 (Édité le 1 janvier 1970 à 01:00)
$selectmail = $bdd->prepare('SELECT mail FROM newsletter');
$selectmail->execute();
// Envoi de l'email
$header="MIME-Version: 1.0\r\n";
$header.='From: "tonsite.com"<no-reply@tonsite.com>'."\n";
$header.='Content-Type:text/html; charset="utf-8"'."\n";
$header.='Content-Transfet-Encoding: 8bit';
while($affichmail = $selectmail->fetch()) {
$mail[] = $affichmail['mail'];
}
$destinataires = implode(',', $mail);
mail($destinataires, "Objet du mail", $_POST['newsletterMessage'], $header);
joris1904 Le 12 juin 2016 à 08:26 (Édité le 1 janvier 1970 à 01:00)
Ranarxhag Le 12 juin 2016 à 10:28 (Édité le 1 janvier 1970 à 01:00)
Fais comme ceci ! J'ai testé, ça fonctionne et comme ça on en parle plus car j'ai de plus en plus l'air d'un con à force 😄
$selectmail = $bdd->prepare('SELECT mail FROM newsletter');
$selectmail->execute();
// Envoi de l'email
$header="MIME-Version: 1.0\r\n";
$header.='From: "tonsite.com"<no-reply@tonsite.com>'."\n";
$header.='Content-Type:text/html; charset="utf-8"'."\n";
$header.='Content-Transfet-Encoding: 8bit';
while($affichmail = $selectmail->fetch()) {
mail($affichmail['mail'], "Objet du mail", 'HELLO LES GARS', $header);
}
joris1904 Le 12 juin 2016 à 10:45 (Édité le 1 janvier 1970 à 01:00)
Ranarxhag Le 12 juin 2016 à 11:11 (Édité le 1 janvier 1970 à 01:00)
eziom Le 12 juin 2016 à 12:47 (Édité le 1 janvier 1970 à 01:00)
$contenu_reponse="<html><body>ton texte avec du html</body></html>";
ajoute ça au pire
mail($destinataires, "Objet : switch", $contenu_reponse, $header);
puis ça
c'est personnelle
joris1904 Le 12 juin 2016 à 15:26 (Édité le 12 juin 2016 à 15:35)
Ranarxhag Le 13 juin 2016 à 16:23 (Édité le 1 janvier 1970 à 01:00)