Invio mail uguale a più destinatari

di il
10 risposte

Invio mail uguale a più destinatari

Buongiorno, vengo al dunque ho un form dove seleziono con checkbox i nomi e relative mail degli utenti, dopodichè inserendo il testo nella textarea invio la mail in formato html a tutti gli utenti selezionati. Il problema è che viene inviata una mail sola e non due o più.
questo è il codice della pagina html
<legend>Seleziona Utenti per invio Mail</legend>
                 <p>
					<label class="block">Utenti:</label>
            <p></p>
	<?php
	if($result = $mysqli->query("SELECT nome, user_id FROM utenti")){
		while ($row = $result->fetch_assoc())
		{
			echo '<input id="utente" class="wrong" type="checkbox" name="utente">';
			echo '<label value="'. $row['user_id'].'">', $row['nome'] ,'</label>';
		}
	}
	?>
					<input id="oltre" class="wrong" type="hidden" value="oltre" name="oltre">

				</p>
invece questo il codice per controllo ed invio mail attinendo dal db con mysqli

	//preparo un messaggio a vuoto per gli errori
		$ok_ko="";
		$visibilità = "hidden";

		if(!isset($_POST['utente']) && (empty($_POST['utente']))){
			$ok_ko.="Scegli il nome.<br /> ";
			echo "$ok_ko";
			echo "<meta http-equiv='Refresh' content='2; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";}
		if(!isset ($_POST['text_mail']) && (empty($_POST['text_mail']))){
			$ok_ko.="Scrivi qualcosa.<br />";
			echo "$ok_ko";
			echo "<meta http-equiv='Refresh' content='2; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";}

		//Se la variabile NON è VUOTA lasci ogli errori
		if ($ok_ko != "") {
			$visibilità = "visibile";
			echo"<div style=\"visibility:$visibilità;\" class=\"ok_ko\"></div>";
		// Altrimenti se è VUOTA lascio e proseguo
		} else {
			$ok_ko ="";
		}

		if (empty($ok_ko)) {

			//Filtro dati con MYSQLI
			$utente				 	= 		$_POST['utente'];
			$_SESSION['text_mail'] 	= 		$mysqli->real_escape_string(trim($_POST['text_mail']));

			require_once('phpmailer/PHPMailerAutoload.php');

			$marconcini	=	"mail1@gmail.com";
			$biblionet 	=	"mail2@gmail.com";

			$mail = new PHPMailer();
			$mail->IsSMTP();                    // attiva l'invio tramiteSMTP
			$mail->isHTML(true);				//Attivo invio come html
			$mail->SMTPDebug	= 0;				//0 Senza debug, se voglio i dettagli metto 4
			//$mail->Debugoutput = "error_log";    // scrive messaggi di errore nel log di PHP, si può lasciare sempre
			$mail->Host     	= "smtp.gmail.com";		// ok PHPmailer
			$mail->Port     	= 465;
			$mail->SMTPAuth		= true;
			$mail->SMTPSecure	= "ssl";
			$mail->Username 	= "mail@gmail.com";
			$mail->Password 	= "pass";

			/*Messagio in php o html usato come allegto*/
			$body = file_get_contents('mail_pubblicita.php');    // testo del messaggio in formato html

			// Mail che riceveranno solo gli utenti selezionati del form

			if($result = $mysqli->query("SELECT * FROM utenti")){
				while ($row = $result->fetch_assoc())

				{
					$nome 	= $row['nome'];
					$email	= $row['email'];

					// ----- impostazione dei destinatari
					$mail->ClearAllRecipients( );
					$mail->AddAddress($email, $nome);

				}
			} else {
				Errore: $mysqli->ErrorInfo;
			}


			//$mail->AddAddress ($email,$nome); //Mail che riceverà l'utente registrato
			$mail->From = ($biblionet); //Inserire la mail di Andrea che apparirà come mail del mittente
			$mail->FromName = ("Biblionet San Maurizio"); // Nome che apparirà come Mittente al cliente
			//$mail->WordWrap		= 50;
			$mail->AddReplyTo($marconcini , 'Andrea ');
			$mail->AddReplyTo($biblionet , 'Biblionet San Maurizio');
			$mail->Subject = ("Novità dalla Biblionet");
			$mail->AltBody = "Per visualizzare questo messaggio utilizza un programma adatto e che legga le mail in HTML!"; // Opzionale, da testare
			$mail->Body = $body;
dove sbaglio?

10 Risposte

  • Re: Invio mail uguale a più destinatari

    Ciao,

    penso che qualcosa di questo genere possa funzionare:
        <legend>Seleziona Utenti per invio Mail</legend>
                         <p>
                       <label class="block">Utenti:</label>
                    <p></p>
           <?php
           if ($result = $mysqli->query("SELECT nome, user_id FROM utenti"))
           {
              while ($row = $result->fetch_assoc())
              {
                 echo '<input id="utente_'. $row['user_id'].'" class="wrong" type="checkbox" name="utente[]" value="'. $row['user_id'].'">';
                 echo '<label for="utente_'. $row['user_id'].'">', $row['nome'] ,'</label>';
              }
           }
           ?>
                       <input id="oltre" class="wrong" type="hidden" value="oltre" name="oltre">
    
                    </p>
    e poi:
           //preparo un messaggio a vuoto per gli errori
              $ok_ko="";
              $visibilità = "hidden";
    
              if (!empty($_POST['utente']))
                 $utenti = array_filter(array_map('intval', $_POST['utente']));
    
              if (empty($utenti))
              {
                 $ok_ko.="Scegli il nome.<br /> ";
                 echo "$ok_ko";
                 echo "<meta http-equiv='Refresh' content='2; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
              }
              if (empty($_POST['text_mail']))
              {
                 $ok_ko.="Scrivi qualcosa.<br />";
                 echo "$ok_ko";
                 echo "<meta http-equiv='Refresh' content='2; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
              }
    
              //Se la variabile NON è VUOTA lasci ogli errori
              if ($ok_ko != "")
              {
                 $visibilità = "visibile";
                 echo"<div style=\"visibility:$visibilità;\" class=\"ok_ko\"></div>";
              // Altrimenti se è VUOTA lascio e proseguo
              }
              else
              {
                 $ok_ko ="";
              }
    
              if (empty($ok_ko))
              {
                 $_SESSION['text_mail']    =       $mysqli->real_escape_string(trim($_POST['text_mail']));
    
                 require_once('phpmailer/PHPMailerAutoload.php');
    
                 $marconcini   =   "mail1@gmail.com";
                 $biblionet    =   "mail2@gmail.com";
    
                 $mail = new PHPMailer();
                 $mail->IsSMTP();                    // attiva l'invio tramiteSMTP
                 $mail->isHTML(true);            //Attivo invio come html
                 $mail->SMTPDebug   = 0;            //0 Senza debug, se voglio i dettagli metto 4
                 //$mail->Debugoutput = "error_log";    // scrive messaggi di errore nel log di PHP, si può lasciare sempre
                 $mail->Host        = "smtp.gmail.com";      // ok PHPmailer
                 $mail->Port        = 465;
                 $mail->SMTPAuth      = true;
                 $mail->SMTPSecure   = "ssl";
                 $mail->Username    = "mail@gmail.com";
                 $mail->Password    = "pass";
    
                 /*Messagio in php o html usato come allegto*/
                 $body = file_get_contents('mail_pubblicita.php');    // testo del messaggio in formato html
    
                 // Mail che riceveranno solo gli utenti selezionati del form
    
                 if ($result = $mysqli->query("SELECT * FROM utenti WHERE user_id IN (" . implode(',', $utenti) . ")"))
                 {
                    while ($row = $result->fetch_assoc())
                    {
                       $nome    = $row['nome'];
                       $email   = $row['email'];
    
                       // ----- impostazione dei destinatari
                       $mail->ClearAllRecipients( );
                       $mail->AddAddress($email, $nome);
    
                    }
                 }
                 else
                 {
                    Errore: $mysqli->ErrorInfo;
                 }
    
    
                 //$mail->AddAddress ($email,$nome); //Mail che riceverà l'utente registrato
                 $mail->From = ($biblionet); //Inserire la mail di Andrea che apparirà come mail del mittente
                 $mail->FromName = ("Biblionet San Maurizio"); // Nome che apparirà come Mittente al cliente
                 //$mail->WordWrap      = 50;
                 $mail->AddReplyTo($marconcini , 'Andrea ');
                 $mail->AddReplyTo($biblionet , 'Biblionet San Maurizio');
                 $mail->Subject = ("Novità dalla Biblionet");
                 $mail->AltBody = "Per visualizzare questo messaggio utilizza un programma adatto e che legga le mail in HTML!"; // Opzionale, da testare
                 $mail->Body = $body;
    Il principio è che quello che tu inviavi con:
    '<input id="utente" class="wrong" type="checkbox" name="utente">';
    era un singolo valore, non un array di valori come serve a te, per fare ciò devi usare:
    '<input id="utente_'. $row['user_id'].'" class="wrong" type="checkbox" name="utente[]" value="'. $row['user_id'].'">';
    Inoltre il tag "label" non ha un attributo "value", quello deve essere associato sempre all'input. La label al massimo ha il "for" per collegarla all'input relativo.
  • Re: Invio mail uguale a più destinatari

    Rieccomi, scusate l'assenza ma tra casa, lavoro e varie, il tempo è risicato!
    Ho provato a cambiare il codice mettendo questo, solo che ricevo errore 1054 quando seleziono due o più user:
    Qua filtro i dati dopo aver controllato che siano stati inseriti
    
    	$utente				 	= 		$_POST['utente'];
    			$_SESSION['text_mail'] 	= 		$mysqli->real_escape_string(trim($_POST['text_mail']));
    
    poi visto che gli utenti sono in array faccio un implode così:
    
    $implode_user = implode($utente,",");
    
    if ($result = $mysqli->query("SELECT email, nome FROM utenti WHERE user_id IN (".$implode_user.")")) {
    				while ($row = $result->fetch_assoc())
    				{
    					$email	= $row['email'];
    					$mail->ClearAllRecipients( );
    				}
    
    mentre questo è il codice per prelevare i dati con checkbox
    
    if($result = $mysqli->query("SELECT nome, user_id FROM utenti")){
    			while ($row = $result->fetch_assoc())
    			{
    				echo '<input id="'.$row['user_id'].'" class="wrong" type="checkbox" name="utente[]" value="'. $row['nome'].'">';
    				echo '<label value="">', $row['nome'] ,'</label>';
    			}
    	}
    
    Tralasciando le graffe e le parentesi che non coincidono, da questo ho un errore numero 1054. Non so che sia e non capisco cosa sia errato.

    Avete idee?
  • Re: Invio mail uguale a più destinatari

    L'errore 1054 è relativo a mysql e indica che nella query fai riferimento ad un attributo che non esiste.

    Quindi controlla di averli scritti tutti correttamente.

    ciao
  • Re: Invio mail uguale a più destinatari

    Infatti non riesco a prelevare i valori dall'input. il valore name="utente[]" che è un array mi da NULL facendo un var_dump.
    Essendo la voce un array che devo prelevare dal form e poi associare alla mail dell'utente selezionato, come posso fare?

    Suggerimenti?
  • Re: Invio mail uguale a più destinatari

    Noti qualcosa di strano in
    name="utente[]" 
    ?
    Suggerimento: errore di sintassi.
  • Re: Invio mail uguale a più destinatari

    Ciao, ho guardato in rete per capire dove stava il problema ma sinceramente non lo vedo. È forse un problema legato al value che deve avere lo stesso valore?

    O forse che la voce utente deve essere uguale a quella presente nel db?
  • Re: Invio mail uguale a più destinatari

    Paperino78 ha scritto:


    da questo ho un errore numero 1054.
    Qual'è l'intero messaggio d'errore?
    Quale colonna non trova?

    Se ti da un errore "Unknown column" parrebbe che una tra le colonne email, nome e user_id non ci sia nella tabella utenti.
    Magari un typo?

    Oppure: dal poco codice che hai postato, $_POST['utente'] è mandato a mysql senza essere veramente "pulito" (quindi ci potrebbe finire dentro di tutto un po', e se uno dei nomi avesse un apice o altro potrebbe causare errori nella query), e quanto viene preso dal database sembra essere considerato pulito, quindi se ad esempio un nome contenesse delle virgolette o altre cose, queste potrebbe "rompere" il markup HTML e quindi mandare al $_POST dati inattesi.
    Magari mi sto preoccupando troppo, ma Io farei un controllino anche a questo.

    Oppure, e questo è probabilmente il caso:
    $implode_user = implode($utente,",");
    forse sarebbe meglio come:
    $implode_user = "'" . implode("', '", $utente) . "'";
    così che i nomi siano inclusin in apici singoli e quindi trattati da stringhe da mysql.
  • Re: Invio mail uguale a più destinatari

    Ok, vedo che le possibilità di errore sono diverse. Appena rientro a casa farò i controlli del caso poi vi farò sapere.
    Nel frattempo grazie.
  • Re: Invio mail uguale a più destinatari

    Rieccomi, più confuso che mail!!
    Qualcuno potrebbe spiegarmi cosa devo utilizzare se un foreach o while o cosa per riuscire a prelevare i valori, in questo caso nomi, da delle checkbox, associarli alle loro rispettive mail?

    Ho provato un while e dopo un foreach, ma non riesco ad associare i nomi prelevati alle mail del db

    Ne sto uscendo pazzo, e non so più dove andare a sbattere la testa.

    Grazie a tutti
  • Re: Invio mail uguale a più destinatari

    Problema risolto, qui di seguito il codice che al mmento funziona, se poi qualcuno ha dei consigli da darmi li apprezzerò.
    
    $implode_user_id= implode(", ",$_POST['user_id']);
    
    if ($result = $mysqli->query("SELECT user_id, email FROM utenti WHERE user_id IN (".$implode_user_id.")")) {
    				while($row = $result->fetch_array()){
    					$array[]= $row['email'];
    					foreach($array as $indice) {
    						echo "";
    					$email	= $indice;
    					// ----- impostazione dei destinatari
    					$mail->AddAddress ($email); //Mail che riceverà l'utente registrato
    					}
    				}
    
    recupero i dati con POST faccio un implode e dopo un while ed un foreach porto i dati alla funzione phpmailer per l'invio.

    Grazie a tutti
Devi accedere o registrarti per scrivere nel forum
10 risposte