Invio mail diversi destinatari

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Sera a tutti, sto creando una semplicissima pagina tramite la quale posso inviare a più persone una mail, quando parlo di persone intendo 10 non 1000 quindi non dovrei avere problemi di blacklist. Il meccanismo è semplice, da un piccolo form con textarea e checkbox nella prma inserisco il testo della mail e nella seconda seleziono a chi inviare la mail. Il problema è che non ricevo nulla e non capisco come fare per capire dove sbaglio. posto qui il codice, qualcuno mi potrebbe illuminare? Ho tagliato ovviamente quasi tutto il codice ma la sostanza è questa, visto che i controlli li faccio prima e funzionano bene in quanto è lo stesso modello che adotto per altre pagine dello stesso sito. Con la variabile $ok_ko verifico che non ci siano errori quindi procedo...
PHP:
if (empty($ok_ko)) {

			//Seleziono dal DB utenti nomi e mails per preparare l'invio
			$stmt = $mysqli->prepare("SELECT * FROM utenti WHERE nome = ?, email = ?");
			$stmt->bind_param('ss', $nome, $email);
			$stmt->execute();
			$result = $stmt->get_result();

				while ($row = $result->fetch_array())
				{
					if ($row == 0) {
						echo "Problemi nel recupero delle mail";
					} else {
						for ($a=$row; $a>=1; $a--){
						$row = $result->fetch_array();
						$nome = $row[0];
						$email = $row[1];
						}
					}
				}

			require_once('phpmailer/PHPMailerAutoload.php');
il codice mi permette di interrogare il Db estrarre nomi ed email egli utenti metterli in array, e far si che ogni mail parta come se fosse singola, non cc ne ccn.
PHP:
$mail->AddAddress ($email,$nome); //Mail che riceverà l'utente registrato
 
io farei così, (se ti "garba" metti a posto i nomi delle variabili e i parametri)
PHP:
if (empty($ok_ko)) { 

  require_once 'PHPMailer/PHPMailerAutoload.php';

  $mail = new PHPMailer();

  $mail->SMTPDebug = 4;			// attiva log dell'invio, ELIMINARE quando si mette in "produzione"
  $mail->Debugoutput = "error_log";	// scrive messaggi di errore nel log di PHP, si può lasciare sempre


// ----- impostazione del servizio
  $mail->IsSMTP();

  $mail->Host       = "smtp.example.com";	// SMTP servizio mail
  $mail->Port       = 587;			// 25, 465, 587
  $mail->SMTPAuth   = true;			// 25 = false 465,587 = true
  $mail->SMTPSecure = "tls";			// 25 = "" 465 = "ssl" 587 = "tls"
  $mail->Username   = "[email protected]";	// utente conosciuto dal servizio mail usato
  $mail->Password   = "password";		// password dell'utente

  $mail->From       = "[email protected]";	// uguale al mittente (alcuni servizi ignorano, altri errore)
  $mail->FromName   = "Mailer";			// nome che precede indirizzo e-mail mittente

  $mail->AddReplyTo("[email protected]", "Mailer");	// rispondere a ...


// ----- impostazione del messaggio
  $mail->WordWrap   = 50;			// set word wrap
  $mail->IsHTML(true);				// send as HTML

  $mail->Subject = $eM_subject." ".date('d-m-Y H:i:s');
  $mail->Body    = $eM_body;
  if(!empty($eM_AltBody)) $mail->AltBody = $eM_AltBody;

  // $body = file_get_contents('contents.html');	// testo del messaggio in formato html
  // $mail->MsgHTML($body);


// ----- include l'allegato
  $mail->AddAttachment("/path/to/image.jpg", "my_new_image");


// ----- Seleziono dal DB utenti nomi e mails per preparare l'invio 
  $stmt = $mysqli->prepare("SELECT * FROM utenti WHERE nome = ?, email = ?"); 
  $stmt->bind_param('ss', $nome, $email); 
  $stmt->execute(); 
  $result = $stmt->get_result(); 

  while ($row = $result->fetch_array()) 
  { 
    if ($row == 0) { 
      echo "Problemi nel recupero delle mail"; 
    } else { 
      for ($a=$row; $a>=1; $a--){ 
        $row = $result->fetch_array(); 
        $nome = $row[0]; 
        $email = $row[1]; 

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

        // ----- invio della mail
        if($mail->Send()) print "<b>MESSAGGIO INVIATO</b>";
        else              print "<b>ERRORE : MESSAGGIO NON INVIATO</b> - " . $mail->ErrorInfo;
      } 
    } 
  } 
}

ps : non provato e vedo qualche stranezza nella tua parte di codice ( $result->fetch_array(); perché lo esegui in un while e poi in un for ?)
 
Ultima modifica:
la tua parte di codice la scriverei così,
PHP:
  $result = $stmt->get_result(); 

  while ($row = $result->fetch_array()) 
  { 
    $nome = $row[0]; 
    $email = $row[1]; 

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

// ----- invio della mail
    if($mail->Send()) print "<b>MESSAGGIO INVIATO</b>";
    else              print "<b>ERRORE : MESSAGGIO NON INVIATO</b> - " . $mail->ErrorInfo;
  }

inserendo il controllo (da fare) sul numero dei record che verranno ritornati
 
la tua parte di codice la scriverei così,
PHP:
  $result = $stmt->get_result(); 

  while ($row = $result->fetch_array()) 
  { 
    $nome = $row[0]; 
    $email = $row[1]; 

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

// ----- invio della mail
    if($mail->Send()) print "<b>MESSAGGIO INVIATO</b>";
    else              print "<b>ERRORE : MESSAGGIO NON INVIATO</b> - " . $mail->ErrorInfo;
  }

inserendo il controllo (da fare) sul numero dei record che verranno ritornati

Grazie marino51, ma cosa intendi per controllo su i records? Ogni flag che metto su i nomi degli utenti vengono presi e messi come destinatari nella mail.
Inoltre ti volevo chiedere, visto che la mail devo inviarla con i rispettivi nomi degli utenti in ogni singola mail, è obbligatorio mettere il testo in html nello stesso file oppure posso allegare come hai scritto tu cioè così
PHP:
$mail->Body    = $eM_body;

Grazie
 
Ciao, funziona bene o male tutto l'unico problema è che ricevo questo avviso
Codice:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' email=?' at line 1

a fronte di qeusto codice
PHP:
	if(
			$stmt = $mysqli->prepare("SELECT nome, email FROM utenti WHERE nome=?, email=?")){
			$stmt->bind_param('ss', $nome, $email);
			$stmt->execute();
			$result = $stmt->get_result();
			
			while ($row = $result->fetch_array())
			{
				$nome 	= $row[0];
				$email 	= $row[1];
							
				$mail->ClearAllRecipients();
				$mail->AddAddress($email, $nome);
						
			}
			} else {
				die("Errormessage: ". $mysqli->error);
			}

Mi sapresti dare qualche chiarimento? :fonzie:
 
Breve rettifica, ho modificato questa riga inserendo l'operatore AND
PHP:
	$stmt = $mysqli->prepare("SELECT nome, email FROM utenti WHERE nome = ? AND email = ?");
ora l'errore non lo da più di contro ho questo avviso
HTML:
You must provide at least one recipient email address.
questo è il codice completo
PHP:
$stmt = $mysqli->prepare("SELECT nome, email FROM utenti WHERE nome = ? AND email = ?");
					$stmt->bind_param('ss', $nome, $email);
					$stmt->execute();
					$result = $stmt->get_result();

					while ($row = $result->fetch_array())
					{
						$nome = $row[0];
						$email = $row[1];

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

Può essere che non carichi i nomi dalle checkbox?
Inoltre, dovendo mandare una mail in html con una variabile che poi è il nome dell'utente, posso inserirla come allegato oppure devo mettere tutto il markup nella stessa pagina?
 
Ho fatto alcune prove e questo è il risultato ma non va bene ancora.
Questo è il codice per selezionare le mail dal DB
PHP:
	if($result = $mysqli->query("SELECT nome, email FROM utenti")){
			while ($row = $result->fetch_array())

			{
				$nome = $row[0];
				$email = $row[1];

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

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

questo è il codice per inserire dinamicamente i nomi e le mail nel form
PHP:
if($result = $mysqli->query("SELECT nome, user_id FROM utenti")){
		while ($row = $result->fetch_array())
		{
			echo '<input id="utente" class="wrong" type="checkbox" name="utente">';
			echo '<label value="'. $row['user_id'].'">', $row['nome'] ,'</label>';
		}
	}

La mail la manda ma solo l'ultima delle due checkbox anche se le seleziono tutte le checkox.
Qualcuno mi illumini!:hammer::hammer::incazz2:

Inoltre come posso importare un testo scritto nella textarea in un altro file php? Nel caso il codice html della mail lo inserirò nel file del form e non andrò ad recuperare altro dall'esterno
 
è difficile seguirti con tutte le variazioni e con spezzoni di codice,
se potessi postare lo script intero, di invio delle mail, sarebbe meglio

per esempio non capisco l'utilità di questa ricerca nel db
PHP:
$stmt = $mysqli->prepare("SELECT nome, email FROM utenti WHERE nome = ? AND email = ?");
ovvero cerchi due valori che hai già nelle clausole where
 
Ciao, hai ragione, è che con tutti i test ho perso un attimo il filo, allora questo è il codice completo della pagina
PHP:
<?php
if(isset($_POST['invia'])){
	if($_SERVER['REQUEST_METHOD'] == 'POST'){
		//Filtro dati con MYSQLI
		$utente	 	= 		$mysqli->real_escape_string(trim($_POST['utente']));
		$text_mail 	= 		$mysqli->real_escape_string(trim($_POST['text_mail']));


		//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 "<meta http-equiv='Refresh' content='20; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";}
		if(!isset ($_POST['text_mail']) && (empty($_POST['text_mail']))){
			$ok_ko.="Scrivi qualcosa.<br />";
			echo "<meta http-equiv='Refresh' content='20; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";}

		if ($ok_ko != "") {
			$visibilità = "visibile";
			echo"<div style=\"visibility:$visibilità;\" class=\"ok_ko\"></div>";
			$ok_ko ="";
			echo "<meta http-equiv='Refresh' content='40; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
		}

		if (empty($ok_ko)) {

			require_once('phpmailer/PHPMailerAutoload.php');

			$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->Host     	= "smtp.gmail.com";		// ok PHPmailer
			$mail->Port     	= 465;
			$mail->SMTPAuth		= true;
			$mail->SMTPSecure	= "ssl";
			$mail->Username 	= "[email protected]";
			$mail->Password 	= "password";

			$body = file_get_contents('mail_pubblicita.php');    // testo del messaggio in formato html

			// Mail che riceverà solo l'utente con le novità del sito

			if($result = $mysqli->query("SELECT nome, email FROM utenti")){

			while ($row = $result->fetch_array())

			{
				$nome = $row[0];
				$email = $row[1];
}


$mail->AddAddress ($email,$nome); //Mail che riceverà l'utente registrato
$mail->Subject = ("Novità");
$mail->AltBody = "Per visualizzare questo messaggio utilizza un programma adatto e che legga le mail in HTML!"; 
			$mail->Body = $body;

			if (!$mail -> Send()){
				//Messaggio che appare se qualcosa va storto nell'invio della mail
				echo '<div id="benvenuto">
				<p><h3>C\'è stato un errore nell\'invio della mail</h3></p>'. $mail->ErrorInfo; //	Messaggio di errore invio mail
				echo "<meta http-equiv='Refresh' content='3000; URL=contatti.php'>";
			} else {
				echo "La Mail è stata inviata a: <br> ". $email ."";  //Messaggio invio riuscito
				echo "<meta http-equiv='Refresh' content='3000; URL=contatti.php'>";
			}
		} // Chiusura IF variabile $ok

	} // Chiusura IF invio form
} else {
	?>
         <div id="content">

         <form id="jform" action='<?php echo $_SERVER['PHP_SELF']; ?>' method="post">
          <fieldset>
                 <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_array())
		{
			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>
           </fieldset>
              <fieldset>
              <legend>Testo Mail</legend>
                <label>Inserisci qui sotto il testo della mail</label>
                <p></p>
                <textarea name="text_mail" class="wrong" id="text_mail"></textarea>
           </fieldset>
             	<p>
	               	<input type="hidden" name="sendmail" value=""/>
					<button type="submit" class="send" id="send" name="invia">Invia</button>
					<button type="reset" class="send" onclick="self.location.reload(true)">Reset</button>
				</p>
         </form>
         </div><!-- content -->
	<?php
}
?>
        </div><!--contenuto-->
</div><!--contenitore-->
		<div class="vuoto"></div>
		<?php include 'footer.php' ?>
</body>
</html>

nella parte alta ho i controlli sulle checkbox e textarea, poi in realtà dovrei selezionare dal DB i nomi e le mail da inserire nel form che già faccio qua
PHP:
if($result = $mysqli->query("SELECT nome, user_id FROM utenti")){
		while ($row = $result->fetch_array())
		{
			echo '<input id="utente" class="wrong" type="checkbox" name="utente">';
			echo '<label value="'. $row['user_id'].'">', $row['nome'] ,'</label>';
		}
	}
e selezionando le checkbox dovrei inviare la mail solo a chi decido io, ma sicuramente qualcosda non va. Fino adesso il form è corretto ma selezionando due utenti mi viene inviata solo all'ultimo e non a tutti e due.

Il codice
PHP:
$stmt = $mysqli->prepare("SELECT nome, email FROM utenti WHERE nome = ? AND email = ?");
era per la versione con prepared statment ma visto che mi dava continuamente errori e non ne uscivo ho cambiato, al momento non lo adotto, il problema è che inserisco dopo interrogazine al db i campi checkbox ma li faccio alla fine visto come è strutturato il form, forse non avrei bisogno di farlo per inviare la mail dato che li recupero dalle checkbox? O forse dovrei recuperarli in altro modo.
 
Per la cronaca, sono riuscito a risolvere il problema, per correttezza aggiungo qua il codice incrimiato nel caso possa servire a qualcuno:
PHP:
$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 le checkbox selezionate tramite POST faccio un implode che passo poi all'interrogazione del db facendo in modo che ogni valore venga selezionato. Ed infine dopo un while ed un foreach aggiungo l'utente al modulo $mail in quanto uso phpmailer.
Al momento funziona se qualcuno vuole darmi consigli saranno apprezzati.

Grazie a tutti
 

Discussioni simili