Newsgroup: it.comp.www.php
Titolo: inviare email a indirizzi definiti da query

avrei necessita di inviare delle email a specifici indirizzi e non a tutti 
gli utenti del sito (utente1 utente2 e utente3) come invece � specificato 
ora qui sotto nell'array.
gli indirizzi vengono prelevati da una query che si chiama "invisibili" (il 
campo dove � contenuta l'email si chiama 'username') e questi indirizzi 
potrebbero essere solo uno o due anzich� tutti e tre.
come posso fare a gestire gli array variabili?
ecco il codice:
<?php
mysql_select_db($database_server, $server);
$query_eventi = "SELECT id, d, m, y, title, text FROM calendar_mssgs WHERE 
concat_ws('-',y,lpad(m,2,0),lpad(d,2,0)) < curdate() + interval 3 day AND 
concat_ws('-',y,lpad(m,2,0),lpad(d,2,0)) > curdate()";
$eventi = mysql_query($query_eventi, $server) or die(mysql_error());
$row_eventi = mysql_fetch_assoc($eventi);
$totalRows_eventi = mysql_num_rows($eventi); //da questa query ricavo gli 
eventi che si verificheranno nei prossimi uno/due giorni
$evento = $row_eventi['evento'];
$colname_invisibili = "-1";
if (isset($_SESSION['$evento'])) {
  $colname_invisibili = $_SESSION['$evento'];
}
mysql_select_db($database_server, $server);
$query_invisibili = sprintf("SELECT username, hash, fname, lname FROM 
calendar_users WHERE hash NOT IN (SELECT username FROM partecipanti WHERE 
evento = %s)", GetSQLValueString($colname_invisibili, "text"));
$invisibili = mysql_query($query_invisibili, $server) or die(mysql_error());
$row_invisibili = mysql_fetch_assoc($invisibili);
$totalRows_invisibili = mysql_num_rows($invisibili); //da questa query 
ricavo i nomi di coloro che non hanno ancora segnalato la loro presenza a un 
evento
if ($totalRows_invisibili > 0) { //se ci sono persone che non hanno ancora 
segnalato la loro presenza allora....
require("class.phpmailer.php");
$aindirizzi = 
array("
ute...@email.it
","
ute...@email.it
","
ute...@email.it
");
foreach ($aindirizzi as $destinatario)
{
$mail = new PHPMailer();
$mail->SetLanguage("it","./");
$mail->IsSendmail();                                   // send via SMTP
$mail->Host     = "
mail.xxxxxxxxx.it
"; // SMTP servers
$mail->SMTPAuth = true;     // turn on SMTP authentication
$mail->Username = "
segre...@xxxxxxxxx.it
";  // SMTP username
$mail->Password = "xxxxxxxx"; // SMTP password
$mail->From     = "calendario eventi";
$mail->FromName = "Gruppo Grotte CAI Savona ";
$mail->AddAddress($destinatario);
$mail->WordWrap = 100;                              // set word wrap
$mail->IsHTML(false);                               // send as HTML
$mail->Subject = "ATTENZIONE! DEVI CONFERMARE LA TUA PRESENZA AD UN EVENTO 
per il giorno $day/$month/$year ";
$colname_Recordset2 = "-1";
  if (isset($destinatario)) {
    $colname_Recordset2 = $destinatario;
  }
  $query_Recordset2 = sprintf("SELECT uid, username, fname, lname, hash FROM 
calendar_users WHERE username = %s", GetSQLValueString($colname_Recordset2, 
"text"));
  $Recordset2 = mysql_query($query_Recordset2, $server) or 
die(mysql_error());
  $row_Recordset2 = mysql_fetch_assoc($Recordset2);
  $totalRows_Recordset2 = mysql_num_rows($Recordset2); //determino il codice 
id dell utente indispensabile per confermare la presenza tramite il link 
spedito via email e va infatti a cercare la corrispondenza tra indirizzo 
destinatario e username (email) nel database per ricavare il codice id
$mail->Body = "Ad oggi non ci risulta ancora che tu abbia segnalato al 
gruppo la tua presenza/assenza al seguente evento: ".$row_eventi['title']." 
per il giorno 
".$row_eventi['d']."/".$row_eventi['m']."/".$row_eventi['y']."<br>
<br>
".
$mail->AltBody  =  $row_eventi['text']."<br>
<br>
"."Provvedi a confermare la tua presenza cliccando <a
href=\"
http://www.xxxxxxxxxxxx.it/areasoci/presente.php?id=
".$row_Recordset2['hash']."&evento=".$row_eventi['id']."&presenza=1\"> 
qui </a>"."altrimenti clicca su <a 
href=\"
http://www.xxxxxxxxxx.it/areasoci/presente.php?id=
".$row_Recordset2['hash']."&evento=".$row_eventi['id']."&presenza=0\"> 
purtroppo non ci sar&ograve; </a>"." Diversamente continuerai a ricevere 
questa e-mail ogni due ore sino al giorno dell evento!";
$mail->Send();
}
}
?> 


Forese ho letto male, ma lo stesso campo contiene pi� indirizzi e-mail?
Ciao
Leonardo

 ha scritto nel messaggio 
news:1FI%m.5703$Ua....@twister2.libero.it...

in quella tabella ci sono i nomi degli utenti e il campo username contiene 
il loro indirizzo email quindi s�, sono piu di uno, ovvero un indirizzo 
email per ogni utente 

 ha scritto nel messaggio 
news:4b3f5ab2$0$822$4faf...@reader5.news.tin.it...

Non ci siamo capiti, 1 indirizzo email per ogni campo dello stesso record 
oppure hai un campo per gli indirizzi e-mail (dello stesso utente se ne ha 
pi� di uno)  separati fra loro da qualcosa, per esempio una virgola?
Ciao
Leonardo

 Non ci siamo capiti, 1 indirizzo email per ogni campo dello stesso record
s� ho 1 indirizzo email per ogni campo dello stesso record, ad ogni record 
corrisponde un utente. 

 ha scritto nel messaggio 
news:4b3f83b9$0$1103$4faf...@reader4.news.tin.it...

Secondo me dovresti avere un campo CONFERMA (Si/No) nel record dell'utente 
(ma potrebbe essere anche un campo in una tabella collegata fra ID evento ed 
ID utente).
se l'utente conferma il campo CONFERMA contiene "Si", altrimenti ad 
intervalli temporali che stabilisci tu riesegui al query ed a tutti gli 
utenti il cui campo CONFERMA non contiene "Si" mandi di nuove una email.
Non ti serve un array, le email le mandi via via scorrendo il risultato 
della query.
Ciao
Leonardo

 ha scritto nel messaggio 
news:vqM%m.5817$Ua....@twister2.libero.it...

Ok ti ringrazio ma a quello ci avevo gi� pensato io con un campo PRESENTE 
valorizzato Si/No proprio come dici tu. Infatti poi la query tira fuori gli 
indirizzi e-mail di coloro che non hanno ancora detto se saranno presente o 
meno all'evento.
Il mio problema � scorrere quelle email con il risultato della query!
mi potresti gentilmente postare il codice corretto per scorrere solo quelle 
email estrapolate dalla query? 

 ha scritto nel messaggio 
news:4b3f9643$0$1136$4faf...@reader1.news.tin.it...

Non devi scorrere le email ma rieseguire la query e filtrare solo i record 
con No nel campo PRESENTE ed inviare a tutti la email.
Ciao
Leonardo

 Leonardo
quelli con valore no nel campo presente � gente che ha confermato di essere 
assente, quelli con si hanno confermato di essere presenti, io devo spedire 
le email a chi ha dato una risposta per niente che risolvo con quella 
semplice subquery con il NOT IN.
il problema non � la query  che � risolto ma come scorrere le email!!


non capisco cosa intendi
ciao
LEO


in pratica avrei corretto il codice cosi ma di e-mail non ne arrivino 
seppure le query siano corrette:
<?php
mysql_select_db($database_server, $server);
$query_eventi = "SELECT id, d, m, y, title, text FROM calendar_mssgs WHERE 
concat_ws('-',y,lpad(m,2,0),lpad(d,2,0)) < curdate() + interval 3 day AND 
concat_ws('-',y,lpad(m,2,0),lpad(d,2,0)) > curdate()";
$eventi = mysql_query($query_eventi, $server) or die(mysql_error());
$row_eventi = mysql_fetch_assoc($eventi);
$totalRows_eventi = mysql_num_rows($eventi); //da questa query ricavo gli 
eventi che si verificheranno nei prossimi uno/due giorni
$evento = $row_eventi['evento'];
//da questa query ricavo i nomi di coloro che non hanno ancora segnalato la 
loro presenza a un evento
if ($totalRows_invisibili > 0) { //se ci sono persone che non hanno ancora 
segnalato a loro presenza allora....
require("class.phpmailer.php");
$colname_invisibili = "-1";
if (isset($_SESSION['$evento'])) {
  $colname_invisibili = $_SESSION['$evento'];
}
mysql_select_db($database_server, $server);
$query_invisibili = sprintf("SELECT username FROM calendar_users WHERE hash 
NOT IN (SELECT username FROM partecipanti WHERE evento = %s)", 
GetSQLValueString($colname_invisibili, "text"));
$invisibili = mysql_query($query_invisibili, $server) or die(mysql_error());
while (list($destinatario) = mysql_fetch_assoc($invisibili));
{
$mail = new PHPMailer();
$mail->SetLanguage("it","./");
$mail->IsSendmail();                                   // send via SMTP
$mail->Host     = "
mail.xxxxxxxxxxxx.it
"; // SMTP servers
$mail->SMTPAuth = true;     // turn on SMTP authentication
$mail->Username = "
segre...@xxxxxxx.it
";  // SMTP username
$mail->Password = "xxxxxxxxxx"; // SMTP password
$mail->From     = "calendario eventi";
$mail->FromName = "Gruppo xxxxx xxxx xxxxxxx ";
$mail->AddAddress($destinatario);






href=\"
http://www.xxxxxxxxx.it/areasoci/presente.php?id=
".$row_Recordset2['hash']."&evento=".$row_eventi['id']."&presenza=0\"> 


 ?>
Come fai ad affermare che � corretto? che controllo fai? ti stampi a video i 
risultati della query e corrispondono a quegli che ti aspetti?
----------------
Da quello che ho capito il nocciolo � questo:
Hai una tabella che contiene dei record, ed in ciascuno di essi ci sono (fra 
altri) i seguenti campi: ID - nome/cognome - email - SiNo.
Tu avvisi le persone che fanno parte di questa lista che c'� un evento.
Lo fai tramite e-mail
La e-mail viene inviata in seguito alla esecuzione di una query che 
seleziona il campo Si/No che deve essere vuoto.
Gli utenti possono rispondere si o no per confermare e meno la loro 
partecipazione.
Per farlo rispondono alla tue email facendo click su di un link (1 per il si 
e l'altro per il no) .
Il codice sottostante alla pagina aggiorna il database.
Per quelli che non hanno risposto, ad un certo intervallo di tempo la query 
viene rieseguita, e questo fino al giorno dell'evento.
-------------
La parte del codice che esegue la query e quella che invia la e-mail sono 
indipendenti. Pu� funzionare la query e non l'invio di e-mail o viceversa.
------------
In ogni caso l'invio della e-mail lo farei contestualmente all'esecuzione 
della query mentre cicli sui record ottenuti.
<?php
$query = "codice della query filtra il campo si/No che deve essere vuoto";
$result = mysql_query($query) or die ("Quesry failed; " .mysql_error());
while ($row = mysql_fetch_array($result))
{
echo "<br>";
echo $row['CampoSiNo'], " - " , $row['CampoEmail'];// vedi SUL MONITOR CHE 
SUCCEDE
if(strlen($row['CampoSiNo'])<1)// invio email SE  NON CONTIENE CARATTERI
{
// invio mail
$a=$row['CampoEmail'];
$oggetto="oggetto mail";
$messaggio="messaggio mail"; // DEVE CONTENERE il testo del messaggio e 
soprattutto i LINK CHE PERMETTONO DI RISPONDERE CON SI O NO
mail($a, $oggetto, $messaggio);
}
}
?>
Ciao
Leonardo

 query viene rieseguita, e questo fino al giorno dell'evento.
eseguo una cronjob su questa pagina che ripete l'invio dell'email sintanto 
che non risulta 0 o 1 su quell'utente e per quell'evento.
ho effettuato le prove che dicevi e questo codice funziona alla grande....ma 
mi rimane ancora un punto da risolvere.....devo ciclare la query eventi in 
maiera tale che le email vengano inviate agli utenti per OGNI evento 
prelevato. ho provato ad inserire "while ($row_eventi = 
mysql_fetch_array($eventi))
" ma non funge....
<?php
mysql_select_db($database_server, $server);
$query_eventi = "SELECT id, d, m, y, title, text FROM calendar_mssgs WHERE 
concat_ws('-',y,lpad(m,2,0),lpad(d,2,0)) < curdate() + interval 10 day AND 
concat_ws('-',y,lpad(m,2,0),lpad(d,2,0)) > curdate() - interval 4 day";
$eventi = mysql_query($query_eventi, $server) or die(mysql_error());
$row_eventi = mysql_fetch_assoc($eventi);
$totalRows_eventi = mysql_num_rows($eventi); //da questa query ricavo gli 
eventi che si verificheranno nei prossimi uno/due giorni
if ($totalRows_eventi > 0) { //se ci sono eventi a breve, allora....
require("class.phpmailer.php");
$colname = "-1";
if (isset($row_eventi['id'])) {
  $colname = $row_eventi['id'];
}
mysql_select_db($database_server, $server);
$query = sprintf("SELECT username, hash FROM calendar_users WHERE hash NOT 
IN (SELECT username FROM partecipanti WHERE evento = %s)", 
GetSQLValueString($colname, "text"));
$result = mysql_query($query) or die ("Query failed; " .mysql_error()); //da 
questa query ricavo i nomi di coloro che non hanno ancora segnalato la loro 
presenza a un evento
while ($row = mysql_fetch_array($result))
{
echo "<br>";
echo $colname;
echo $row['username'];// vedi SUL MONITOR i nomi prelevati
// invio mail
//$a=$row['username'];
//$oggetto="messaggio di prova NON LEGGERE";
$colname_Recordset2 = "-1";
if (isset($row['username'])) {
$colname_Recordset2 = $row['username'];
}
$query_Recordset2 = sprintf("SELECT uid, username, fname, lname, hash FROM 
calendar_users WHERE username = %s", GetSQLValueString($colname_Recordset2, 
"text"));
$Recordset2 = mysql_query($query_Recordset2, $server) or die(mysql_error());
$row_Recordset2 = mysql_fetch_assoc($Recordset2);
$totalRows_Recordset2 = mysql_num_rows($Recordset2);
$messaggio="Ad oggi non ci risulta ancora che tu abbia segnalato al gruppo 
la tua presenza/assenza al seguente evento: ".$row_eventi['title']." per il 
giorno ".$row_eventi['d']."/".$row_eventi['m']."/".$row_eventi['y']." 
Provvedi a confermare la tua presenza cliccando <a 
href=\"
http://www.ggcaisavona.it/areasoci/presente.php?id=
".$row_Recordset2['hash']."&evento=".$row_eventi['id']."&presenza=1\"> 
qui </a>"."altrimenti clicca su <a 
href=\"
http://www.ggcaisavona.it/areasoci/presente.php?id=
".$row_Recordset2['hash']."&evento=".$row_eventi['id']."&presenza=0\"> 
purtroppo non ci sar&ograve; </a>"." Diversamente continuerai a ricevere 
questa e-mail ogni due ore sino al giorno dell evento!";
echo $messaggio; //da togliere quando � tutto ok
//mail($a, $oggetto, $messaggio);
}
}
?>


Un punto dolente potrebbe essere che il compo Si/No o 0/1, non � sufficente 
o non � ben gestito dal codice.
Dovrebbe contenere 3 valori ad esempio 0 nessuna risposta o primo avvio - 1 
accettazione - 2 diniego
Io adopereri parole come si/no/NN che si prestano meglio ad un controllo ed 
inizializzando il campo a NN (con una query di aggiornamento) prima della 
prima esecuzione della query della quale scriviamo..
Mi � capitato che campi con contenuto nullo (non zero e non vuoto) abbiano 
dato risultati imprevisti.
Un'altra cosa che mi pare ridondante � l'invio delle e-mail con 
class.phpmailer.php, a me pare che bastino poche righe di codice all'interno 
del loop che legge i riusultati della query che filtra il campi Si/No, e 
come si dice, quel che non c'� non si guasta.
Ciao
Leonardo

 campi Si/No, e come si dice, quel che non c'� non si guasta.
non ho capito cosa vuoi dire... 

 non ho capito cosa vuoi dire...
Che il mancato funzionamento potrebbe essere nell'interfacciamento con 
phpmailer. e l'utilizzo di phpmailer mi pare ridondante.
Ciao
Leonardo