Envoi de mail selon checkbox

Résolu
LaChaux78 Messages postés 585 Date d'inscription   Statut Membre Dernière intervention   -  
LaChaux78 Messages postés 585 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'essaie de mettre en place un formulaire d'envoi de mail un peu compliqué pour moi.
le membre peut choisir un ou plusieurs destinataires pré-définis dans une base MySQL pour envoyer un message privé.
Actuellement je ne peux envoyer uniquement à 1 personne ou sinon si je sélectionne plusieurs membres ça envoie uniquement au premier membre de la liste.
Pouvez-vous m'aider s'ils vous plait je suis vraiment à court d'idée.
Je vous remercie.
voici mes case à cocher
	echo "<div><input type='checkbox' id='checkAll'/><b>(Sélectionner tous les membres)</b></div>";
	echo "<div><pre>";
    while ($donnees = $requete->fetch()) {
        $id = $donnees->idpers;
        echo "<input type='checkbox' class='ckb' id='env_".$id."' name='envoyer[]' value='".$id."'>".$donnees->nom . " " . $donnees->prenom ."" . PHP_EOL;
    }
	echo "</pre></div>";

voici mon envoie de mail
$sql = "SELECT nom,prenom,email
	FROM cdc_personnes,cdc_adherer
	WHERE cdc_personnes.idpers = cdc_adherer.idpers
	AND annee='$aadh'
	AND idclas IN (2)";
	$requete = $bdd->prepare($sql);
	$requete->execute();
			
	if ($donnees2 = $requete->fetch()) {
	// Adresse email des destinataires
	$destinataire = $donnees2->email;
	$prenom = $donnees2->prenom;
	while ($donnees2 = $requete->fetch()) {
	$destinataire .= ', '.$_POST['envoyer'];
	}
	// Titre de l'email
	$sujet = 'Nouveau message Clique de Cruet';
	// Contenu du message de l'email
	$message = '<html>';
	$message .= '<body><p>Bonjour '.$prenom.', <br/>';
	$message .= 'Je t\'ai envoyé un nouveau message dans ton espace membre...<br/>';
	$message .= 'Bonne lecture.<br/>';
	$message .= '<p>'.$_SESSION['prenom'].'</p>';
	$message .= '<p style="color:red;">Merci de ne pas répondre à cet email, ceci est un envoi automatique</p></body>';
	$message .= '</html>';
	// Pour envoyer un email HTML, l'en-tête Content-type doit être défini
	$headers = 'MIME-Version: 1.0'."\r\n";
	$headers .= 'Content-type: text/html; charset=utf-8'."\r\n";
	$headers .= 'From:"mon_site"<>'."\n";
	// Fonction principale qui envoi l'email
	mail($destinataire, $sujet, $message, $headers);
	}

5 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, je pense que ta page d'envoi de mail ne traite pas correctement la réponse reçue. peux-tu partager ce qu'affiche
    var_dump($_POST);
    ?
     
    0
  2. LaChaux78 Messages postés 585 Date d'inscription   Statut Membre Dernière intervention   32
     
    Bonjour

    Voici l'affichage avec var_dump
    array(7) { ["MAX_FILE_SIZE"]=> string(6) "500000" ["dmess"]=> string(10) "18/11/2017" ["tmess"]=> string(7) "fffffff" ["mess"]=> string(11) "fffffffffff" ["action"]=> string(7) "ajouter" ["submit"]=> string(18) "Envoyer le message" ["envoyer"]=> array(2) { [0]=> string(1) "2" [1]=> string(2) "44" } }
    

    Merci
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      tu vois donc que $_POST['envoyer'] est ceci: array(2) { [0]=> string(1) "2" [1]=> string(2) "44" }

      cela signifie que tu dois envoyer l'email aux personnes dont idpers est 2 ou 44.

      moi je ferais une boucle foreach sur $_POST['envoyer'] , et, pour chaque idpers, je ferais une requête sql pour aller chercher l'email et je compléterais la liste des destinataires avec cet email.
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      en voyant le contenu de $_POST, je me dis que ton formulaire cause l'envoi d'informations inutiles. tu voudras peut-être simplifier cela.
      0
  3. LaChaux78 Messages postés 585 Date d'inscription   Statut Membre Dernière intervention   32
     
    J'ai vraiment essayé d'arriver à quelque chose, j'ai peu de connaissance, tout ce que je sais c'est que je tourne en rond, j'ai fait cette boucle mais ecla me retourne toujours 1 checkbox même si j'en coche 2.
    Pouvez-vous s'ils vous plait m'aider encore, peut-être me donner d'autres précisions.
    Je vous en remercie.
    	foreach($_POST['envoyer'] as $envoyer) {
    		$envoyer = implode(';', $_POST['envoyer']);
    	}
    
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      plutôt ainsi:
      $sql = "SELECT nom,prenom,email
      	FROM cdc_personnes,cdc_adherer
      	WHERE cdc_personnes.idpers = ? AND cdc_adherer.idpers = ?
              AND annee='$aadh'
      	AND idclas IN (2)";
      $requete = $bdd->prepare($sql);
      foreach ( $_POST['envoyer'] as $idpers ) {
      	$requete->execute(array($idpers, $idpers));
      	if ($donnees2 = $requete->fetch()) {
      	// Adresse email des destinataires
      	$destinataire = $donnees2->email;
      	$prenom = $donnees2->prenom;
      	...
      	}
      }
      0
  4. LaChaux78 Messages postés 585 Date d'inscription   Statut Membre Dernière intervention   32
     
    Bonjour,
    Merci c'est gentil de ta part ça fonctionne très bien.
    Je me pose juste une question pourquoi dans le tableau execute il y a deux fois "idpers"
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      le tableau utilisé dans execute sert à remplacer le(s) ? dans la requête sql.
      la requête cherche des enregistrements dans deux tables, et, dans chaque table, elle cherche les enregistrements correspondant à l'idpers dont on s'occupe.
      si le SQL avait été écrit comme suit, cela aurait aussi été correct, et le tableau execute aurait contenu une seule fois $idpers.
      SELECT nom,prenom,email
      	FROM cdc_personnes,cdc_adherer
      	WHERE cdc_personnes.idpers = cdc_adherer.idpers
      	AND annee='$aadh'
      	AND idclas IN (2) 
              AND cdc_personnes.idpers = ?

      en y réfléchissant, cela ne sert sans doute à rien de vérifier annee et idclass au moment d'envoyer le mail, donc on pourrait faire simplement:
      $sql = "SELECT nom,prenom,email
      	FROM cdc_personnes
      	WHERE cdc_personnes.idpers = ? ";
      $requete = $bdd->prepare($sql);
      foreach ( $_POST['envoyer'] as $idpers ) {
      	$requete->execute(array($idpers));
      	if ($donnees2 = $requete->fetch()) {
      	// Adresse email des destinataires
      	$destinataire = $donnees2->email;
      	$prenom = $donnees2->prenom;
      	...
      	}
      }
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. LaChaux78 Messages postés 585 Date d'inscription   Statut Membre Dernière intervention   32
     
    Encore un grand merci.
    Cordialement
    0