Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    59

    Invio newsletter con allegati: Info + dubbio time_limit

    Ciao a tutti, avevo creato un post dove chiedevo info riguardo un gestionale per poter gestire una newsletter con tanto di allegati...ma visto che non ne ho trovati e nessuno ha risposto lo sto creando da zero...

    Finora tutto va bene, ma ho dei dubbi sulla parte più importante.

    Il codice che vi fornisco in basso funziona perfettamente (per quanto lo ho testato) ma visto che ho sempre avuto un pò di timore riguardo le newsletter (una piccola distazione e riempio la mail di chissà chi...) volevo chiedere a voi cosa ne pensate, se c'è qualcosa che magari non va bene...

    sto usando phpmailer per semplificare un po il tutto.

    Codice PHP:

    <?php
    include ("config_db.inc.php");
    require_once(
    "class.phpmailer.php");

    $result sql_query("SELECT * FROM iscritti_newsletter where attivo='1'");
    echo 
    "Mail da inviare:"count($result)."
    "
    ;

    // Recupero il valore dei campi del form

    $mittente $_POST['mittente'];
    $oggetto $_POST['oggetto'];
    $messaggio $_POST['messaggio'];

    // Valorizzo le variabili relative all'allegato
    $allegato $_FILES["allegato"]["tmp_name"];
    $file_name $_FILES["allegato"]["name"];

    if (
    is_uploaded_file($allegato)){
    // Invio la mail
            
    $inviate=0;
            for (
    $i=0$i<count($result); $i++)  {
                
    $mail = new PHPMailer();
                
    $mail->From     $mittente;
                
    $mail->FromName "Nome Mittente";
                
    $mail->AddAddress($result[$i]['email']);
                
    $mail->IsHTML(true);  
                
    $mail->Subject  =  $oggetto;
                
    $mail->Body     =  $messaggio;
                
    $mail->AltBody  =  $messaggio_txt;
                
    $mail->AddAttachment($allegato$name $file_name$encoding "base64"$type "application/octet-stream");
                
              if(!
    $mail->Send()){
            echo 
    "Si è verificato un errore nell'invio della mail a ".$result[$i]['email'];
         }else{
            echo 
    "Inviata correttamente a: ".$result[$i]['email']."
    "
    ;
         }  
          
    $inviate=$inviate+1;
    }
                
    echo 
    "Inviate ".$inviate." e-mail. Puoi chiudere questa finestra.";    
    }

    ?>

    La paura più grande è che se per esempio aggiorno la pagina invio di nuovo la mail a tutti...oppure che magari lo script si blocca a metà (in locale a volte va oltre il time_limit) e invio solo la metà delle mail...

    Qualche dritta soprattutto su questi due punti???

    Grazie! ;-)

  2. #2
    Ciao,
    alcuni consigli dati da precedenti esperienze nella gestione di newsletter con molti indirizzi

    1) imposta il tempo limite della pagina 0
    Codice PHP:
    set_time_limit(0); 
    2) aggiungi un campo alla tabella contenente gli indirizzi, usalo come flag per sapere per ogni indirizzo se hai inviato la mail o meno, in pratica lo azzeri prima di iniziare la newsletter, poi mail per mail valorizzi il campo dopo averla invita.
    In questo modo qualsiasi cosa succeda al tuo script potrai sapere a chi hai già inviato ed eventualmente riprendere da quel punto

    3) se le mail sono veramente tante dovresti considerare la possibilità di gestire una temporizzazione nell'invio, in quanto alcuni provider potrebbero limitare il numero di mail ma soprattutto molti server di posta potrebbero vedere come 'spam' l'invio di numerosi messaggi troppo ravvicinati nel tempo
    Artechbrand.it: Realizzazione siti E-commerce -
    Trova il miglior prezzo con Prezzolandia.it

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    59
    Originariamente inviato da Artechbrand

    3) se le mail sono veramente tante dovresti considerare la possibilità di gestire una temporizzazione nell'invio, in quanto alcuni provider potrebbero limitare il numero di mail ma soprattutto molti server di posta potrebbero vedere come 'spam' l'invio di numerosi messaggi troppo ravvicinati nel tempo
    Innanzitutto grazie della risposta, per i primi due punti ho capito perfettamente, ma per il terzo....intendi uno sleep nel ciclo for? forse potrebbe andare bene per il problema da te citato...ma poi quanto durerebbe il ciclo? e poi...impostarlo a quanto lo sleep per la pausa tra una mail e l'altra?

    forse potrebbe risultare utile mettere lo sleep a gruppi di 10...per esempio facendo il modulo della variabile $i e vedere se è multiplo di 10 per effettuare lo sleep??

    Grazie!

  4. #4
    Direi che una sleep possa essere una soluzione,
    tieni conto che in base alla configurazione del PHP il timeout non è detto che possa essere infinito.
    Una possibile soluzione a mio avviso è quella di utilizzare un cron che lancia ad intervalli regolari lo script che invia le mail magari a gruppi di 100,
    utilizzato congiuntamente alla tecnica di 'segnare' le mail già inviate su DB.
    In sostanza ogni volta che lo script viene richiamato manda 100 mail,
    quando le avrà mandate tutte semplicemente non ne manderà più.
    Quando dovrai inviare una seconda newsletter basterà svuotare quel campo e per magia le mail verranno spedite nuovamente.
    Artechbrand.it: Realizzazione siti E-commerce -
    Trova il miglior prezzo con Prezzolandia.it

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    59
    Ho modificato un pò tutto quanto...

    Dal form invece di passare direttamente all'invio salvo tutto in una nuova tabella del database:

    Codice PHP:

    <?php
    $intestazione
    ="Resoconto salvataggio nel Database.";
    $username=$_SESSION['username'];

    $cartella=$_SERVER['DOCUMENT_ROOT']."/allegati_newsletter/";

    //include ("config_db.inc.php");

    // Recupero il valore dei campi del form
    //$destinatario = $_POST['destinatario']; dal campo hidden per debug senza uso db
    //$mittente = $_POST['mittente'];

    $oggetto $_POST['oggetto'];
    $messaggio $_POST['messaggio'];

    // Valorizzo le variabili relative all'allegato
    $allegato $_FILES["allegato"]["tmp_name"];
    $file_name $_FILES["allegato"]["name"];

    $allegato2 $_FILES["allegato2"]["tmp_name"];
    $file_name2 $_FILES["allegato2"]["name"];

    //SALVO GLI ALLEGATI SUL SERVER PER RECUPERARLI IN CASO DI ERRORI

    if (move_uploaded_file($allegato$cartella $file_name))
        {
            
    $percorso_allegato=$cartella.$file_name;    
            print 
    "

    Upload primo file eseguito con successo
    File salvato: "
    .$percorso_allegato."
    </p>"

        }
        else    { print 
    "

    Primo file non presente oppure si sono verificati dei problemi durante l'Upload
    </p>"
    ; }

    if (
    move_uploaded_file($allegato2$cartella $file_name2))
        {
            
    $percorso_allegato2=$cartella.$file_name2;    
            print 
    "

    Upload secondo file eseguito con successo
    File salvato: "
    .$percorso_allegato2."
    </p>"

        }
        else { print 
    "

    Secondo file non presente oppure si sono verificati dei problemi durante l'Upload</p>"
    ; }


    //SALVO LA MAIL NEL DATABASE ARCHIVIO NEWSLETTER

    $query_archivio="INSERT INTO archivio_newsletter (oggetto,messaggio,allegato,allegato2,stato,autore) VALUES ('$oggetto','$messaggio','$percorso_allegato','$percorso_allegato2', 0 ,'$username') ";
    $salvataggio_db_archivio mysql_query$query_archivio $db);

    echo 
    "

    Newsletter salvata correttamente in archivio. Puoi procedere all'invio</p>"
    ;

          
    ?>

    Ho creato poi la pagina in cui visualizzo tutte le newsletter in archivio. Se la newsletter non è stata inviata allora compare il link che richiama lo script per l'invio passando l'id della newsletter salvata in archivio:

    Codice PHP:

    <?php

    //PARAMETRI
    $mail_mittente="admin@localhost";
    $nome_mittente="Newsletter con Allegati";

    //CODICE INVIO

    set_time_limit(0);

    include (
    "config_db.inc.php");
    require_once(
    "class.phpmailer.php");
    $id=$_GET['id'];

    //LEGGO I DATI DA ARCHIVIO

    $result sql_recordset("SELECT * FROM archivio_newsletter where (stato='0' AND id=".$id.") ");
    $oggetto=$result[0]['oggetto'];
    $messaggio=$result[0]['messaggio'];
    $percorso_allegato=$result[0]['allegato'];
    $percorso_allegato2=$result[0]['allegato2'];

    //CONTROLLO SE NON è GIà STATA INVIATA....
    if  (count($result)==0){echo "Newsletter gi&agrave; inviata oppure parametro non corretto";}

    else {
                
    $result sql_recordset("SELECT * FROM iscritti_newsletter where (attivo='1' AND inviata='0') ");
                
    $da_inviare=count($result);
                echo 
    "Mail da inviare:"$da_inviare."
    "
    ;
                
                
    // Invio la mail
                
    $inviate=0;
                for (
    $i=0$i<count($result); $i++)  {
                            
    $mail = new PHPMailer();
                                    
    $mail->From     $mail_mittente;
                                    
    $mail->FromName $nome_mittente;
                                    
    $mail->AddAddress($result[$i]['email']);
                                    
    $mail->IsHTML(true);  
                                    
    $mail->Subject  =  $oggetto;
                                    
    $mail->Body     =  $messaggio;
                                    
    $mail->AltBody  =  $messaggio_txt;
                                    
    //if (is_uploaded_file($allegato)){$mail->AddAttachment($allegato, $name = $file_name, $encoding = "base64", $type = "application/octet-stream");}
                                    //if (is_uploaded_file($allegato2)){$mail->AddAttachment($allegato2, $name = $file_name2, $encoding = "base64", $type = "application/octet-stream");}
                                    
    if (file_exists("$percorso_allegato")) {$mail->AddAttachment($percorso_allegato); }
                                    if (
    file_exists("$percorso_allegato2")) {$mail->AddAttachment($percorso_allegato2); }
                            if(!
    $mail->Send()){
                                        echo 
    "Si è verificato un errore nell'invio della mail a ".$result[$i]['email']."
    "
    ;
                            }else{        
                                        
    $update_flag mysql_query("UPDATE iscritti_newsletter SET inviata = '1' WHERE id = '".$result[$i]['id']."';"$db);
                                        echo 
    "Inviata correttamente a: ".$result[$i]['email']."
    "
    ;
                                        
    $inviate=$inviate+1;
                                    }  
                }
                
                echo 
    "

    Inviate "
    .$inviate." di ".$da_inviare." e-mail.</p>";
                if (
    $inviate==$da_inviare){
                    
    $azzero_stato_invio mysql_query("UPDATE iscritti_newsletter SET inviata = '0';"$db);
                    
    $update_stato_db_newsletter mysql_query("UPDATE archivio_newsletter SET stato = '1' WHERE id=".$id.";"$db);
                    echo 
    "

    Lo stato degli invii relativi agli iscritti &egrave; stato azzerato. Il sistema &egrave; pronto per monitorare il prossimo invio.</p>"
    ;
                    echo 
    "

    JOB DONE! Puoi chiudere questa finestra.

    "
    ;
                }
                else {
                    echo (
    "

    Invio parziale. Ripetere l'operazione e controllare che vada a buon fine</p>"
    );
                }
                
    }

    ?>

    Codice PHP:
    $result sql_recordset("SELECT * FROM iscritti_newsletter where (attivo='1' AND inviata='0') "); 
    Con questo mi richiamo gli utenti attivi e a cui non è stata inviata la mail, ad ogni invio provvedo a fare l'update dello stato dell'invio utente per utente.


    In questo modo, in caso di interruzioni, richiamando lo script ricomincio da dove ero rimasto proprio seguendo il tuo consiglio!

    L'unica vera modifica è che prima gli allegati erano al volo, adesso provvedo a salvarmi il percorso direttamente in database;

    secondo ho tutto il corpo della mail, l'oggetto ecc ecc nel database e non disponibili con il post.

    Questo perchè se per qualche strano motivo si chiudesse la pagina, i dati da dove li avrei potuti recuperare!!??!?

    per il resto ci dovremmo essere finalmente!!!!!!!!! (a parte il cron o lo sleep che implementerò dopo aver testato sul server).
    Altri consigli???
    Grazieeeeee!!!!!!!!

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.