Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    problema invio newsletter

    Ciao a tutti,

    ho scritto questo script per inviare delle mail dal sito,
    lo script dovrebbe prendere gli indirizzi da un db e inviare le mail a blocchi di 50 per volta... solo che non lo fa:


    <?php
    // settaggio cookie per recupero dati form
    $oggetto="NOVOITALIA NEWSLETTER";
    if (isset($_POST["FCKeditor1"])) {
    $valorecookie=$oggetto."|".$_POST['FCKeditor1'];
    setcookie("INVIO",$valorecookie,time()+3600*12);
    $data=date('Y/m/d');
    $ora=date('H:i');
    }
    $blocco=$_GET["blocco"];
    $newblocco=$blocco+1;
    $ultima_email=$blocco*50;
    $prima_email=$ultima_email-50+1;
    echo "Invio da $prima_email a $ultima_email";
    ?>

    <?php
    /// imposto ciclo invio mail ////
    $fineinvio=1;
    $contatore=0;
    require("credenziali.php");
    $strsql="SELECT id,mail FROM mail_list"; // query db
    $rs=@mysql_query("$strsql",$link) or die("Errore query database". mysql_error());
    while (($riga=mysql_fetch_array($rs))&&($contatore<=$ult ima_email)) {
    $contatore=$contatore+1;
    if (($contatore>=$prima_email)&&($contatore<=$ultima_ email)) {
    $fineinvio=0;
    $id=$riga['id'];
    $destinatario=$riga['mail'];

    $tipomail="MIME-Version:1.0\nContent-type: text/html; charset=iso-8859-1";
    $mittente="From: NOVOITALIA<info@novoitalia.it>\n$tipomail";
    $oggetto="NOVOITALIA NEWSLETTER";
    $headers .= "X-Sender: <info@novoitalia.it>\r\n"; //Il mittente
    $headers .= "X-Mailer: PHP\r\n"; //mailer
    $headers .= "X-Priority: 3\r\n"; //1 UrgentMessage, 3 Normal
    $headers .= "Return-Path: <info@novoitalia.it>\r\n"; // Return-path
    $messaggio=stripslashes($_POST['FCKeditor1']);
    if (isset($_COOKIE["INVIO"])) {
    $ogg_mess=$_COOKIE["INVIO"];
    $riga_email=explode("|",$valorecookie);
    $oggetto=$riga_email[0];
    $messaggio=stripslashes($riga_email[1]);
    }

    /// parametri invio mail //////
    mail($destinatario,$oggetto,$messaggio,$mittente,$ headers);
    }
    }
    if ($fineinvio) {
    header("Location:sended.php");
    }

    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="refresh" content="5;url=mail_send_attachment.php?blocco=<?= $newblocco?>" />
    <title>Invio della newsletter <? echo $oggetto; ?> in corso..... attendere il completamento
    </title>
    </head>
    <body>
    </body>
    </html>

    C'e' qualcuno che gentilmente sa aiutarmi?????
    Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    115
    Questo script è completamente sbagliato dal punto di vista semantico.

    e poi per farla molto più facile dovresti dividere la query a blocchi da 50 in modo che tutto il lavoro lo fai fare al SQL e tu in fase di programmazione te ne sbatti.

    codice:
    $blocco = 50;
    
    
    // imposti gli header il testo e l'oggetto e il destinatario che sarà il tuo indirizzo stesso
    $destinatario = "tuoindirizzo@email.it";
    $header1 = "From: Inviante <inviante@dominio.org>\r\n";
    
    $header2 = "X-Mailer: Il nostro Php\r\n";
    
    // costruiamo le intestazioni specifiche per il formato HTML
    $header2 .= "MIME-Version: 1.0\r\n";
    $header2 .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n"; 
    
    // il charset ovviamente è quello che vuoi te
    $header2 .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    
    $oggetto = "oggetto del messaggio";
    $messaggio = "testo del messaggio vero e proprio";
    
    
    $email = true;
    $contatore = 0;
    
    while($email)
    {
        $query = mysql_query("SELECT id,mail FROM mail_list LIMIT ".($contatore * $blocco).", $blocco");
        if (mysql_num_rows($query))
        {
    
          unset($header);
    
          for ($i = 0; $i < mysql_num_rows($query); $i++)
          {
              $row = mysql_fetch_array($query);
    
              // mettiamo nell'header tutti i riceventi
              $header .= "Bcc: <". $row['id'] .">\r\n";
          }
    
          // inviamo la mail
          mail($destinatario, $oggetto, $testo, $header1.$header.$header2);
    
          $contatore++;
        }
        else
          $email = false;
    }

    purtroppo anche questo script scritto al volo (quindi ci potrebbe essere qualche errore visto che non l'ho provato...) può risultare scomodo.

    io non so quante email tu debba inviare, ma se questo prende un tempo troppo lungo e supera i 3 minuti (impostazione di default del php) la pagina scade, a te compare una pagina bianca e non sai dove è rimasto ad inviare.

    anche impostando questo tempo maggiore avresti una rottura di scatole infinita. la cosa migliore è far girare questo script in background sulla macchina.

    Cerco di spiegare come ho fatto la mia newsletter che è in grado di mandare un numero al più infinito di email:

    io invio i dati alla pagina1.php, questa attraverso una richiesta POST invia i dati (dopo averli verificati) ad una seconda pagina che chiameremo invio.php. Questa pagina ovviamente fa il controllo che la richiesta venga dalla macchina stessa (e non da un ip esterno) e in caso contrario non prosegue per evitare che altri possano inviare email. a questo punto forso la chiusura di pagina1.php che mi mostra a video che l'invio è iniziato correttamente. nel frattempo alla pagina invio.php ho settato di non terminare mai (attraverso set_time_limit(0), in questo modo questa continua ad essere eseguita nonostante non ci sia più nessuno che la richiede.

    La pagina invio.php cicla tutti gli utenti della newsletter, e invia una mail alla volta a intervalli di un secondo (per non impallare la macchina) in modo tale che sulla mail siano personalizzabili nome e cognome. a questo punto il suo stato viene continuamente registrato su una tabella php e mostrato da una terza pagina status.php che mi mostra in tempo reale lo stato di avanzamento della newsletter.

    in ultimo sulla pagina status.php deve essere possibile impostare un campo sul mysql in modo tale che se impostato in una certa maniera la pagina invio.php che costantemente lo monitora si blocca e smette di inviare.

    Spero che ti sia stato di aiuto.


    Buon Lavoro
    Macbook 1.3'' v5

  3. #3
    Buongiorno,

    Ti ringrazio molto dei consigli che mi hai dispensato, sicuramente cerchero' di scrivere la newsletter nel modo in cui mi hai consigliato, grazie ancora della spiegazione, sei stato molto gentile!!!

    Ciao

  4. #4
    Scusa ma volevo un chiarimento riguardo al fatto del tempo massimo di attesa di php.

    Ma se negli header metto un meta tag di refresh ogni 5 secondi lo script non viene eseguito ininterrotamente ma viene eseguito poi stacca per 5 secondi e poi riprende. Giusto?

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    115
    assolutamente no. facciamo un po' di chiarezza:


    lato server:

    la pagina viene generata in un tempo t e poi viene inviata al client. Al client arriva solo dopo essere stata completamente eseguita.


    lato client:

    la pagina viene interpretata ed eseguita dal browser.


    punto 1) se il tempo t è troppo lungo il client esce dall'attesa e mostra una pagina di errore. (solitamente questo tempo è di 3 minuti..)

    punto 2) il metatag viene interpretato lato client e non da server - essendo un elmento html - di conseguenza se non arriva la pagina non può essere interpretato.




    Edit: se per header intendevi la funzione header del php questa viene eseguita si al momento di esecuzione, ma il reindirizzamento viene eseguito al momento del caricamento della pagina.
    NB: la funzione header("Location: pagina.php"); assolutamente non termina l'esecuzione della pagina..
    Macbook 1.3'' v5

  6. #6
    Mi piace un sacco la tua soluzione
    ma ho qualche dubbio su come realizzarla
    potresti darmi una mano via chat? :!!!

    Pamy

    Originariamente inviato da KolduS
    Questo script è completamente sbagliato dal punto di vista semantico.

    e poi per farla molto più facile dovresti dividere la query a blocchi da 50 in modo che tutto il lavoro lo fai fare al SQL e tu in fase di programmazione te ne sbatti.

    codice:
    $blocco = 50;
    
    
    // imposti gli header il testo e l'oggetto e il destinatario che sarà il tuo indirizzo stesso
    $destinatario = "tuoindirizzo@email.it";
    $header1 = "From: Inviante <inviante@dominio.org>\r\n";
    
    $header2 = "X-Mailer: Il nostro Php\r\n";
    
    // costruiamo le intestazioni specifiche per il formato HTML
    $header2 .= "MIME-Version: 1.0\r\n";
    $header2 .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n"; 
    
    // il charset ovviamente è quello che vuoi te
    $header2 .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    
    $oggetto = "oggetto del messaggio";
    $messaggio = "testo del messaggio vero e proprio";
    
    
    $email = true;
    $contatore = 0;
    
    while($email)
    {
        $query = mysql_query("SELECT id,mail FROM mail_list LIMIT ".($contatore * $blocco).", $blocco");
        if (mysql_num_rows($query))
        {
    
          unset($header);
    
          for ($i = 0; $i < mysql_num_rows($query); $i++)
          {
              $row = mysql_fetch_array($query);
    
              // mettiamo nell'header tutti i riceventi
              $header .= "Bcc: <". $row['id'] .">\r\n";
          }
    
          // inviamo la mail
          mail($destinatario, $oggetto, $testo, $header1.$header.$header2);
    
          $contatore++;
        }
        else
          $email = false;
    }

    purtroppo anche questo script scritto al volo (quindi ci potrebbe essere qualche errore visto che non l'ho provato...) può risultare scomodo.

    io non so quante email tu debba inviare, ma se questo prende un tempo troppo lungo e supera i 3 minuti (impostazione di default del php) la pagina scade, a te compare una pagina bianca e non sai dove è rimasto ad inviare.

    anche impostando questo tempo maggiore avresti una rottura di scatole infinita. la cosa migliore è far girare questo script in background sulla macchina.

    Cerco di spiegare come ho fatto la mia newsletter che è in grado di mandare un numero al più infinito di email:

    io invio i dati alla pagina1.php, questa attraverso una richiesta POST invia i dati (dopo averli verificati) ad una seconda pagina che chiameremo invio.php. Questa pagina ovviamente fa il controllo che la richiesta venga dalla macchina stessa (e non da un ip esterno) e in caso contrario non prosegue per evitare che altri possano inviare email. a questo punto forso la chiusura di pagina1.php che mi mostra a video che l'invio è iniziato correttamente. nel frattempo alla pagina invio.php ho settato di non terminare mai (attraverso set_time_limit(0), in questo modo questa continua ad essere eseguita nonostante non ci sia più nessuno che la richiede.

    La pagina invio.php cicla tutti gli utenti della newsletter, e invia una mail alla volta a intervalli di un secondo (per non impallare la macchina) in modo tale che sulla mail siano personalizzabili nome e cognome. a questo punto il suo stato viene continuamente registrato su una tabella php e mostrato da una terza pagina status.php che mi mostra in tempo reale lo stato di avanzamento della newsletter.

    in ultimo sulla pagina status.php deve essere possibile impostare un campo sul mysql in modo tale che se impostato in una certa maniera la pagina invio.php che costantemente lo monitora si blocca e smette di inviare.

    Spero che ti sia stato di aiuto.


    Buon Lavoro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.