faire une newsletter

jeannot_gates

jeannot_gates Le 10 juin 2016 à 14:57 (Édité le 25 janvier 2019 à 17:51)

bonjour  primfx j'ai vue sur le pied de page de ton site une partie reserver au newsletter j'aimerais savoir si tu pouvais nous faire un tuto sur ça. ou s'il y'a un utlisateur du forum qui serai capable de faire cela.
Ranarxhag

Ranarxhag Le 10 juin 2016 à 18:21 (Édité le 12 juin 2016 à 01:00)

Yo ! Créer un système de newsletter n'est pas compliqué.. 😀

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

joris1904 Le 10 juin 2016 à 22:59

salut tu as fais une erreur par ici
         $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

Ranarxhag Le 11 juin 2016 à 00:46

Étrange j'étais certain de l'avoir corrigé. 😀

J'ai corrigé maintenant, désolé 😰 :)
joris1904

joris1904 Le 11 juin 2016 à 06:54 (Édité le 11 juin 2016 à 07:05)

ok tous fonctionne niquel petite correction du code

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 😀 😀 😀
eziom

eziom Le 11 juin 2016 à 19:56

Perso ça ne marche pas 
joris1904

joris1904 Le 11 juin 2016 à 20:00

@eziom je test la partie php je ne l'avais pas encore test mais pour l'intégré a la BDD sa fonctionne niquel 😀 (quelqu'un aurait un code pour éviter que l'on ne puisse pas mettre plusieurs fois l'adresse @mail dans la bdd ?)


je test le reste du code dans la soirée
eziom

eziom Le 11 juin 2016 à 20:03

pour envoyer ça ne marche pas  
eziom

eziom Le 11 juin 2016 à 20:46

dit moi si toi ça fonctionne 
joris1904

joris1904 Le 11 juin 2016 à 21:33

@eziom pour le moment sa ne fonctionne pas j'ai une autre erreur que la tienne
Warning:  mail() expects parameter 1 to be string, array given in /home/u258251883/public_html/v2/envoietraitement.php on line 14
eziom

eziom Le 11 juin 2016 à 23:01

idem
eziom

eziom Le 11 juin 2016 à 23:06

je croie que c'est l’hébergeur qui n'accepte pas les mail()
 
joris1904

joris1904 Le 11 juin 2016 à 23:18

moi il accepte très bien les mail car quand je fais confirmé les comptes c'est par email
Ranarxhag

Ranarxhag Le 11 juin 2016 à 23:29 (Édité le 12 juin 2016 à 00:59)

OMG grosse erreur de ma part les gars ! 

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

TheOldNoob Le 11 juin 2016 à 23:36

Salut l'ami,

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

joris1904 Le 11 juin 2016 à 23:44

niquel sa fonctionne pour le code mais tu as oublié le ; a la ligne 8
joris1904

joris1904 Le 11 juin 2016 à 23:55

cela fonctionne que pour un seul mail -_- sa envoie pas au autre
Ranarxhag

Ranarxhag Le 12 juin 2016 à 00:59

Effectivement.. Tu as raison ! Le bon code est le suivant et cette fois-ci, je l'ai testé ! Vraiment désolé !

$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

joris1904 Le 12 juin 2016 à 08:26

Bonjour cela envoie bien les email au adresse mais sa affiche les autres adresses dans l'email est ce normal ?
Ranarxhag

Ranarxhag Le 12 juin 2016 à 10:28

Yo !

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

joris1904 Le 12 juin 2016 à 10:45

@Ranarxhag tkt entre nous 2 je pense que tu en sais plusque moi sur le php et puis sa arrive de se trompé aussi 😀
Ranarxhag

Ranarxhag Le 12 juin 2016 à 11:11

@joris1904 Je disais un peu ça à la blague mais c'est au moins la 5ième solution que je donne qui est pas forcément juste 😄 En tout cas, dis-moi si ça fonctionne pour toi 😀 
eziom

eziom Le 12 juin 2016 à 12:47

$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

joris1904 Le 12 juin 2016 à 15:26 (Édité le 12 juin 2016 à 15:35)

quelqu'un a un code pour se désinscrire ?
Ranarxhag

Ranarxhag Le 13 juin 2016 à 16:23

Avec ce que je t'ai donné, tu es largement capable maintenant de supprimer un membre d'une BDD tout de même .. 😀 Copier-coller du code, ça va plus vite mais ça te fait pas progresser 😉