Risultati da 1 a 10 di 10

Discussione: Invio email a blocchi

  1. #1
    navajo75 è offline Utente del Forum
    Data Registrazione
    Mar 2012
    Messaggi
    64

    Invio email a blocchi

    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.

    Codice 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 "jyttjtjytjyjyyt@libero.it";       
    $headers "From: io <io@io.it>\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

  2. #2
    navajo75 è offline Utente del Forum
    Data Registrazione
    Mar 2012
    Messaggi
    64
    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

  3. #3
    L'avatar di borgo italia
    borgo italia è offline Super Moderatore
    Data Registrazione
    Feb 2008
    Località
    PR
    Messaggi
    11,225
    ciao
    perchè al posto del contatore non provi a modificare la query in questo modo?
    Codice 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

  4. #4
    navajo75 è offline Utente del Forum
    Data Registrazione
    Mar 2012
    Messaggi
    64
    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 pincopallo@pincopallo.it"
    "Email 2 di 1000 inviata a pincopallo@pincapalla.it"

    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
    Codice PHP:
    mysql_num_rows 
    (nel mio caso sono 1000)
    2) scrivo il seguente codice:
    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

  5. #5
    L'avatar di borgo italia
    borgo italia è offline Super Moderatore
    Data Registrazione
    Feb 2008
    Località
    PR
    Messaggi
    11,225
    ciao
    per indicare quante/di è abbastanza semplice (scrivo sul mio script, ma lo puoi adattare al tuo)
    Codice 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

  6. #6
    navajo75 è offline Utente del Forum
    Data Registrazione
    Mar 2012
    Messaggi
    64
    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

  7. #7
    L'avatar di borgo italia
    borgo italia è offline Super Moderatore
    Data Registrazione
    Feb 2008
    Località
    PR
    Messaggi
    11,225
    ciao
    anch'io (anche se speravo nella pallavolo, non ci rimane che la pallanuoto)

  8. #8
    navajo75 è offline Utente del Forum
    Data Registrazione
    Mar 2012
    Messaggi
    64
    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

  9. #9
    L'avatar di borgo italia
    borgo italia è offline Super Moderatore
    Data Registrazione
    Feb 2008
    Località
    PR
    Messaggi
    11,225
    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)

  10. #10
    navajo75 è offline Utente del Forum
    Data Registrazione
    Mar 2012
    Messaggi
    64
    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

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •