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
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
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
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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)
 

navajo75

Utente Attivo
16 Mar 2012
103
1
18
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
Autore Titolo Forum Risposte Data
J while dentro while per invio email blocchi PHP 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Invio di email PHP 0
Cosina Upload multiplo con invio allegati per email PHP 0
S Invio email da form PHP 8
max1974 Invio email PHP 12
F Estrazione Email di persone selezionate e attive / facebook + invio di massa! Annunci servizi di Social Media Marketing 0
ANDREA20 [PHP] Modulo email invio PHP 5
Tommy03 Errore invio email con PHP PHP 1
C [PHP] Problema Invio Email Elseif PHP 2
Tommy03 Invio email con PHP PHP 3
bubino8 [WordPress] Invio email da sito WordPress 2
A [PHP] Invio email quando viene visitata una pagina PHP 7
L Settaggio parametri per invio email Ip Cam Sricam IP Cam e Videosorveglianza 13
B MYSQL-INVIO EMAIL O MESSAGGIO AVVISO MySQL 0
Matteo Lorenzon [PHP][WORDPRESS] Form in Wordpress, creazione PDF con dati del form ed invio tramite email WordPress 1
R PROBLEMA INVIO EMAIL AL CAMBIO DI STATO ORDINE E-Commerce 1
ANDREA20 [MySQL] [PHP] Invio email ordine MySQL 12
ANDREA20 [PHP] Non riesco ad impostare reset password invio via email PHP 6
Y INVIO AUTOMATICO EMAIL CON PHP PHP 4
ANDREA20 [PHP] Invio ordine via email PHP 14
P problemi invio email con phpmailer PHP 47
L invio smtp con phpmailer - problema invia due volte la email allo stesso utente PHP 0
Monital Invio email con dati di una funzione JS PHP 1
A Invio Email alla connessione di un Client su Lan Reti LAN e Wireless 2
B Invio email multiple PHPMAILER PHP 5
asevenx problema invio email tramite form PHP 3
Y Invio email automatico database background Database 1
S creazione test con invio risposta a una email prescelta PHP 4
A invio email con immagine inline senza clips PHP 0
J Scritp invio email convalida indirizzo PHP 13
R invio email php con allegato PHP 1
P Problemi con phpmail ed invio email PHP 0
A invio email dove sbaglio PHP 1
Task Mc Problema form invio email da sito ç__ç PHP 4
Z Invio email PHP 6
L Aiuto per ultimazione form invio email PHP 3
T invio email Classic ASP 4
F Problema form invio email php PHP 3
F form invio email php PHP 5
A problema con l'invio della password tramite email PHP 23
P Eroore su invio email PHP 6
P Invio email e richiamo di una funzione PHP 11
V invio automatico email PHP 11
P Problema invio email da php PHP 9
E Invio email (era: phpmailer) PHP 52
S Invio Email Tramite Php PHP 2
M invio email con più di un allegato PHP 1
A php msql invio dati per email PHP 2
K invio email programmato... PHP 15

Discussioni simili