Invio email a blocchi

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Buongiorno a tutti,

sto cercando d'implemetare uno script che mi permetta d'inviare mail a blocchi di 50, prelevando gli indirizzi da una tabella del mio DB.

PHP:
$db_selection = mysql_select_db($nomedb, $nome) or die ("Selezione del database fallita<br><br>");   
// la tabella prova contiene un campo (inviato) settato a no per default
$query = "SELECT * FROM prova";   
$result = mysql_query ($query, $nome) or die ("");   
$contatore=0;   
while ($riga = mysql_fetch_row($result)) {  
// ricavo l'id della tabella prova, contenente gli indirizzi dei miei iscritti     
$id=$riga[0];       
$inviato="si";       
$contatore = $contatore + 1; 
// la riga[2] corrisponde al campo inviato della tabella prova      
if($contatore<=50 && $riga[2]=="no") {       
$tipo_email = "MIME-Version: 1.0\nContent-type: text/html; charset=utf-8";       
$oggetto = "E' solo una prova";       
$destinatario = "[email protected]";       
$headers = "From: io <[email protected]>\n$tipo_email";       
$headers .= "\r\nBcc: $riga[1]\r\n\r\n";       
$headers .= "\r\nX-Mailer: PHP/" . phpversion();       
$messaggio = "                  
<html>                    
<body>                      
<table align=\"center\" width=\"600\" border=\"0\"bordercolor=\"#FF9900\">                        
<tr>                          
<td>                            
<a href=\"http://www.io.it/io/io\" title=\"Il portale per personalizzare gli strumenti per io\" target=\"_blank\">                              
<img src=\"http://127.0.0.1/altri/io/io/img/invio_news_img/pinguini.jpg\" border=\"0\"/>                            
</a>                               
</td>                        
</tr>                      
</table>                   
</body>                  
</html>                  ";                             
mail($destinatario, $oggetto, $messaggio, $headers);       
echo "Email inviata a $riga[1]<br/><br/>"; 
// eseguo l'update della riga della tabella prova, in modo da far cambiare in si il valore del campo inviato      
$query_uno = "UPDATE prova SET inviato='$inviato' WHERE id='$id'";       
$result = mysql_query ($query_uno, $nome); 
} else {        
 break;       
}    
}    
echo "<br>Invio di <b>$contatore</b> email terminato con successo"; ?>

In realtà lo script invia una sola mail e poi mi da il seguente errore:

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource on line 1475

Alla linea 1475 corrisponde il seguente codice: if($contatore<=50 && $riga[2]=="no")

Per quel poco che capisco io, dunque è come se al secondo giro del ciclo while, la condizione if già noi sia più verificata; perchè?

Grazie a tutti,
Marco
 
Chiedo venia, è stata una mia disattenzione.
Ho chiamato due volte $result e questo naturalmente incasina tutto.
A questo punto però approfitto per un altro quesito:

Nell'<head> della pagina che esegue lo script, ho messo questo metatag:

<META HTTP-EQUIV="Refresh" content="10;url=news_prova.php">

L'idea è quella di far refreshare la pagina ogni 10 secondi e proseguire con l'invio delle mail a blocchi.
Sarebbe più o meno così:
La prima volta si esegue lo script che invia 50 mail e fa 50 update ul campo inviato della tabella prova, cambiando lo stato da no a si.
La seconda volta, dopo il refresh, dovrebbero partire altre 50 mail, cominciando dalla 51 e finendo alla 100. In realtà la pagina refresha però non parte più nessuna mail.
Sapresti dirmi dov'è che sto sbagliando per cortesia?

Grazie,
Marco
 
ciao
perchè al posto del contatore non provi a modificare la query in questo modo?
PHP:
//....
$query = "SELECT * FROM prova WHERE inviato='no' LIMIT 50";
$result = mysql_query ($query, $nome) or die ("");
//poi immagino che tu estragga anche l'indirizzo email da inviare con la query
while ($riga=mysql_fetch_array($result)){
	$id=$riga['id'];
	$destinatario=$riga['email'];
	//tutto l'ambaradan del herader msg ecc... che per le parsti che rimngono costanti porterei fuori del while
	if(mail($destinatario, $oggetto, $messaggio, $headers)){
		echo "Email inviata a $riga['nome']<br/><br/>";
		//aggiorno tabella solo se inviata
		$query_uno = mysql_query("UPDATE prova SET inviato='si' WHERE id='$id'");
	}else{
		echo "Non riuscito ad inviare a $riga['nome']<br/><br/>";
	}
	//metti un piccolo tempo di attesa tra un invio e l'altro per non intasare il server
	usleep(50);
}
//....
poi due consigli
uno non inviare più di un centinaio di email al gg altrimenti corri il rischio di entrare in qualche blacklist per spam
due abbandona la funzione mail() e usa la classe phpmailer (o similare) altrimenti rischi che alcuni indirizzi (es pinco @ gmail . com) non vengano ricevuti
 
Innanzitutto grazie per l'aiuto ed i consigli.
Funziona tutto come stavo cercando di fare. Mi è rimasta da fare un'ultima cosa.
Vorrei che ad ogni blocco di mail inviato, apparisse una scritta del tipo

"Email 1 di 1000 inviata a [email protected]"
"Email 2 di 1000 inviata a [email protected]"

e che all'invio della millesima email, il mio cliente venisse reindirizzato ad una pagina che lo congratuli per la corretta operazione eseguita.

Per realizzare ciò, ho in mente questo:

1) mi calcolo il numero totale di reord della tabella prova con la funzione
PHP:
mysql_num_rows
(nel mio caso sono 1000)
2) scrivo il seguente codice:
PHP:
echo "Email <strong>$id</strong> di <strong>$numrows</strong> inviata a <span style=\"font-weight:bold; color:#AE0917;\">$riga[1]</span><br/><br/>";

Il reindirizzamento lo effettuo richiamando la funzione header location.
Quello che mi manca, è come far partire il reindirizzamento stesso appena terminato l'invio della millesima mail.

Saluti,
Marco
 
ciao
per indicare quante/di è abbastanza semplice (scrivo sul mio script, ma lo puoi adattare al tuo)
PHP:
<?php
//.....
$result = mysql_query ($query, $nome) or die ("");
$email_tot=mysql_num_rows($result);
$invii=1;
while ($riga=mysql_fetch_array($result)){
    $id=$riga['id'];
    $destinatario=$riga['email'];
    //tutto l'ambaradan del herader msg ecc... che per le parsti che rimngono costanti porterei fuori del while
    if(mail($destinatario, $oggetto, $messaggio, $headers)){
        echo echo "Email <strong>$id</strong> $invii di <strong>$email_tot</strong> inviata a <span style=\"font-weight:bold; color:#AE0917;\">".$riga[1]."</span><br/><br/>";
        //aggiorno tabella solo se inviata
        $query_uno = mysql_query("UPDATE prova SET inviato='si' WHERE id='$id'");
		$invii++;//se spedita incremento di uno
    }else{
        echo "Non riuscito ad inviare a $riga['nome']<br/><br/>";
    }
    //metti un piccolo tempo di attesa tra un invio e l'altro per non intasare il server
    usleep(50);
}
//....  
?>

se invece devi ricordartene e attribuirli ad un certo utente devi ricorrere ad un db.
comunque stai attento, non so come hai settato ini.php, ma se pensi di inviare 1000 email una dietro l'altra (oltre al fatto che quasi sicuramente entri in una blacklist)
considera nel migliore dei casi che per inviare 1000 email al ritmo di una ogni mezzo secondo impieghi (se tutto va bene) 500 secondi pari a circa 10 minuti e il tempo di vita di uno script è di default 30 sec.
quindi dipo 30 secondi lo script si arresta
 
Ok.
Tenendo ben a mente ciò che mi hai detto e ringraziandoti ancora per la preziosissima collaborazione, ora stacco e mi vedo un pò di Olimpiadi.
Domani faccio tutte le prove del caso e ti faccio sapere.
Buona serata,
Marco
 
Ti confermo che grazie alle tue dritte sono riuscito a completare, ottenendo ciò che desideravo.
Ho provato a creare una tabella prova nel DB del mio cliente. Questa contiene 1000 indirizzi mail, di cui 999 fittizi ed 1 vero (il mio).
Ho caricato la newsletter sullo spazio web del mio cliente ed ho mandato in esecuzione lo script per quattro volte (è il numero delle tipologie a cui il mio cliente dovrà inviare le mail. Precisamente avvocati, notai, commercialisti e società).
Quindi in totale ho inviato 4000 mail ed a me ne dovrebbero arrivare 4.
Al momento non me ne è arrivata neanche una.
Potresti spiegarmi cosa intendi con entrare in una qualche blacklist per favore?
Io devo mandare le mail ai miei iscritti e pensando che il server mi andasse in timeout, ho implementato uno script che me ne manda 50 ogni 5 secondi.
C'è qualcosa d'irregolare in questo?

Ti prego di spiegarmi bene dove sto sbagliando e di dirmi perchè secondo te le 4 mail che avrei dovuto ricevere non sono arrivate.

Grazie,
Marco
 
ciao
per le blacklist ci sono dei programmi/siti che tengono sotto controllo gli invii, tale controllo può essere richiesto anche da alcuni mittenti.
lo so per esperienza diretta alcuni anni fa c'ero incappato anche io (non mi ricordo il nome del servizio) e per diversi mesi non potevo inviare.
tali programmi memorizzano l'indirizzo dell'inviante e quindi moltissime email non vengono ricevute.

poi per il fatto che tu non riceva le 4 email può dipendere da molte cose.
non so quale sia il tuo indirizzo, ma (es., scrivo staccato) xxxx @ libero.it, xxx @ gmail.com , xxx @ email.it ed altri bloccano le email inviate con la funzione mail(), se cerchi nel forum trovi molti post sull'argomento.
un metodo (non sicuro al 100%) è usare la classe phpmailler (o simile) per l'invio (il perchè dopo diversi anni è ancora, per me, un mistero)
 
Finalmente ho ricevuto le 4 mail, meglio tardi che mai; il mio account è libero.
Grazie tante per l'aiuto ed i chiarimenti.
Ho deciso di documentarmi prendendo spunto da ciò che mi hai detto, per cercare di garantire un buon servizio al mio cliente.

E visto che ieri mi hai risposto anche sull'Olimpiade... GIORNO TRISTISSIMO OGGI!!!
Ci toccherà aspettare Rio De janeiro.

Saluti,
Marco
 

Discussioni simili