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
 

marino51

Utente Attivo
28 Feb 2013
3.017
174
63
Lombardia
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:

marino51

Utente Attivo
28 Feb 2013
3.017
174
63
Lombardia
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
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
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
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
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:
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
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?
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
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
 

marino51

Utente Attivo
28 Feb 2013
3.017
174
63
Lombardia
è 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
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
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.
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
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
Autore Titolo Forum Risposte Data
R Invio mail con allegati multipli PHP 0
R Invio mail con allegati da directory PHP 1
Daniele_Carrara Problema timeout - invio mail PHP 7
U PHP bottone per invio mail o ritorno al form PHP 15
G Invio mail con php da dati prelevati da un database PHP 9
AC1 [PHP] Invio Mail PHP 18
B [PHP] Invio mail automatico dopo compilazione form - db PHP 25
A [PHP] Problema invio mail con funzione mail() PHP 3
A [PHP] RISOLTO Invio Mail con Tabella PHP 2
paloppa [PHP] Invio mail da form dubbio PHP 17
F Form mail php errore invio PHP 5
Punix [PHP] problema script invio e-mail PHP 2
G Invio Mail con PHPMailer, problemi SMTP PHP 7
cobra_72 [PHP] problema invio multiplo allegati mail PHP 21
Z Limite invio newsletter con PHP - mail() PHP 4
E [Javascript] Messaggio di avvenuto invio mail non visualizzato Javascript 1
F Invio Mail con Javascript Javascript 25
E Rimuovere "dati in memoria" dopo invio mail [PHP] PHP 18
lucarpenter Settaggio invio mail allarme IP camera P2P IP Cam e Videosorveglianza 9
I form invio mail HTML e CSS 1
F Invio automatico mail php PHP 0
Francesco Polese Errore form invio mail+php PHP 22
R Errore invio mail in php PHP 1
M Errore invio mail da php Posta Elettronica 5
P invio mail da form con dati php PHP 7
webmachine Come programmare l'invio di una mail in PHP? PHP 1
W Estrapolare un indirizzo mail di un form durante l'invio PHP 5
Z Invio mail da telecamere HIKVision - HELP!!! IP Cam e Videosorveglianza 0
M WANSCAM Invio allarme tramite mail IP Cam e Videosorveglianza 4
M configurazione invio mail php PHP 25
I invio mail da form PHP 1
S Form invio mail html, con invio tramite file denominato invio.php PHP 8
asevenx link cliccabile che non funziona con invio mail PHP 1
W problemi incomprensibili invio mail dal sito in PHP PHP 3
M Invio mail con destinatari da mysql con inserimento di nome e cognome PHP 6
Il Matta Problema Form e invio mail PHP 2
G WansCam invio mail IP Cam e Videosorveglianza 11
B Problema form mail per invio doppio allegato PHP 1
F invio di una mail tramite script php PHP 6
D [Risolto] Invio mail a blocchi Classic ASP 31
A Problema orario invio mail per form PHP 4
S [risolto] Invio scheda dettagliata in mail Classic ASP 6
antonio_oti Invio di e-mail tramite PHP PHP 23
O [PHP] Problema Invio Mail PHP 2
I [Risolto] Problemi invio e-mail con CDOSYS con domini @live.it Classic ASP 4
S php form invio mail PHP 3
M problemi invio e-mail Posta Elettronica 8
L Form con invio mail PHP 1
P Invio multiplo mail con phpmailer PHP 5
E Invio mail che funzioni bene PHP 14

Discussioni simili