• User Newbie

    Invio e-mail tramite Swift e Internal Server Error

    Risolto un problema ne nasce subito un altro...

    L'ambito è sempre una newsletter (come nel mio post precedente).
    Devo inivare una stessa e-mail a più di 2000 indirizzi.

    Premetto: ho già preimpostato la variabile max_execution_time a 900.

    Inizialmente ho scelto di usare la classe di PHPMailer ricevendo però alcuni errori (che non dipendono dalla comodissima classe).

    Ho provato allora ad utilizzare Swift, classe con lo stesso scopo.

    Il server su cui testo l'invio è un server aruba con SMTP: smtp.aruba.it con hosting Linux.

    Testando l'inoltro per 2000 indirizzi funziona tutto (l'inoltro e la corretta ricezione di tutti e 2000 gli indirizzi) ma ad un certo punto la pagina web, anzichè reindirizzarmi su esito.php, mi scrive chiaramente


    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error.

    More information about this error may be available in the server error log.


    PS: i log del server non funzionano :S


  • User Attivo

    Ciao Tavrotto,
    probabilmente è un problema di max_execution_time che in modalità safe mode, se non vado errato, non funziona e lo script va in timeout...

    Prova a pubblicare una pagina php con l'istruzione <?php phpinfo(); ?> e ad interrogarla da remoto, così potrai conoscere con certezza se safe mode è abilitato*.* Sempre dalla stessa pagina puoi vedere come è impostato il max_execution_time per verificare se il tuo script va in timeout esattamente allo scadere del tempo impostato per la variabile indicata, in modo da isolare il problema.

    Facci sapere!

    :ciauz:


  • User Newbie

    Ciao ceccus,
    il safe_mode è impostato ad Off sia nel Local sia nel Master..
    Il max_execution_time è di default 120 per Local e Master.
    Ho provato allora ad aggiungere ini_set('max_execution_time', '900'); prima della chiamata a phpinfo(); e il Local mi viene impostato correttamente a 900... quindi teoricamente dovrebbe funzionare...

    La cosa più fastidiosa è che l'invio funziona correttamente ma al termine di tutto mi restituisce un errore :gtsad: ouch!
    Grazie


  • User Attivo

    ...e se fosse un problema di dimensione del buffer? La variabile output_buffering com'è impostata?

    Perché non provi a farti stampare l'ouput sulla stessa pagina (piuttosto che su esito.php), liberando progressivamente il buffer con le due istruzioni ob_flush(); flush(); ?

    Inoltre, perché non fai un confronto line-by-line dei due phpinfo(), in modo da vedere se c'è qualche limite che ti blocca?


  • User Newbie

    Ancora non riesco a risolvere l'errore...
    Ho provato a confrontare i phpinfo del locale e del server ma non mi è sembrato ci fossero variabili troppo diverse o così influenti da bloccare tutto...

    Ho aggiunto, nel ciclo0 che invia le e-mail, le chiamate a funzione per ob_flush(); e flush(); ma il server mi restituisce il solito errore:


    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.
    Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error.
    More information about this error may be available in the server error log.


    Sto veramente cedendo... sono distrutto 😞

    Dove sto sbagliando?

    Grazie


  • User Attivo

    Prova a postare lo script...

    La chiamata a ob_flush(); e flush(); va fatta per liberare il buffer mostrando gli output a schermo, senza però rimandare alla pagina esito.php. Quello che farei io è stampare a monitor una riga ogni 10-100 email, dallo stesso script che le invia, liberando progressivamente il buffer con le due istruzioni indicate.

    Cosa e come passi alla pagina esito.php?


  • User Newbie

    Bhè, per ora ho bloccato il redirect alla pagina esito.php ( usavo header('Location: esito.php'); )
    Ora devo scappare ma appena posso provo a seguire il tuo consiglio di stampare a monitor una riga ogni 10-100 email, dallo stesso script che le invia, liberando progressivamente il buffer con le due istruzioni indicate.

    Grazie


  • User Newbie

    Ok, penso che stavolta siamo proprio vicini alla soluzione!! 😉
    Ho provato semplicemente a stampare, ad ogni ciclio un qualsiasi output (nel mio caso uno spazio vuoto) e l'errore non c'è più..

    Usando semplicemente le due funzioni consigliate sembra quasi non le esegua ma, stampando un qualsiasi output a schermo non restituisce più l'errore (ma limita la mia possibilità di redirect...)

    A questo punto mi chiedo... cosa può essere?
    Grazie mille!! 🙂


  • User Newbie

    OK, PROVO A POSTARE IL CODICE
    Chiedo umilmente scusa a tutti per lo spaghetti code qui sotto...
    Purtroppo la mancanza di tempo, le continue modifiche e test e la compressione del tutto per raggrupparlo in un unico file da incollare qui sul forum, hanno contribuito a peggiorare notevolmente lo script... grazie

    <?php
    require 'testa.php';

    ##########################################

    /* 
    *   Classe che prende indirizzi e-mail da un database MySQL, 
    *   li suddivide in blocchi (20 di default) e invia una e-mail personalizzata 
    *   ad ognuno di questi destinatari. 
    */
    
    $met = '900'; 
    $fdd = '20'; 
    $anteprima = stripslashes($_POST['anteprima_seria']); 
    

    // includo le librerie necessarie alla connnessione al database
    require_once "lib/Swift.php";
    require_once "lib/Swift/Connection/SMTP.php";
    include "mdb-database/config.inc.php";

    $swift =& new Swift(new Swift_Connection_SMTP("smtp.aruba.it", 25)); 
    

    // estendo il max_execution_time a TOT minuti per ogni invio in blocco
    ini_set('max_execution_time', $met);
    ini_set('display_errors', 'Off');

    // id newsletter
    $id_nl = htmlspecialchars($_POST['id']);

    // OGGETTO DELLA NEWSLETTER                 
    
        $path = 'h t t p : / / w w w . m i o s i t o . i t /'; 
    
    // TESTO DELLA NEWSLETTER 
        $testo = ''; 
        $testo .= '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv=Content-Type content="text/html; charset=UTF-8" /><title>Newsletter</title>'; 
        $testo .= '<META http-equiv="Content-Type" content="text/html; charset=UTF-8">'; 
        $testo .= '<link rel="stylesheet" type="text/css" href="'.$path.'style.css" />'; 
        $testo .= '</head><body>'; 
            // CONTENT 
        $testo .= $_POST['anteprima_seria']; 
        $testo .= '</body></html>'; 
    
    // IMPOSTO LA NEWSLETTER COME "INVIATA" 
        $sql_nl_inviata = 'UPDATE archivio SET inviata="1", data_invio="'.date("Y-m-d").'" WHERE id="'.$id_nl.'"'; 
        @mysql_query($sql_nl_inviata, $conn); 
    
    // PREPARO ED ESEGUO L'INVIO 
    
    // calcolo il numero di blocchi da considerare 
        $sql_count_indirizzi = 'SELECT COUNT(*) FROM newsletter'; 
        $res_count = mysql_query($sql_count_indirizzi, $conn) 
                                or die(mysql_error()); 
    
    // controllo se il numero di indirizzi è maggiore del numero di 
    // indirizzi per blocco 
    
        $numero_iscritti_tmp = mysql_fetch_row($res_count); 
        $numero_iscritti = $numero_iscritti_tmp[0]; 
    
        if($numero_iscritti>$fdd){ 
            // divido il numero di iscritti totali per il numero di blocchi desiderato 
            $n_blocchi = ($numero_iscritti/$fdd); 
    
            // arrotondo il risultato ad un intero 
            if(is_float($n_blocchi)) 
                $n_blocchi = (int)$n_blocchi+1; 
            else 
                $n_blocchi = (int)$n_blocchi; 
        } 
        else 
            $n_blocchi = 1; 
    
        // per ogni blocco effettuo una query chiedendo un preciso range 
        // di indirizzi 
        for($i = 0; $i < $n_blocchi; $i++){ 
    
            // controllo se il blocco è il primo (parte da 0) o uno dei 
            // successivi 
            if(($i+1) <= $n_blocchi){ 
                // selezioni il range di record da mostrare 
                $da = ($fdd * $i); 
         
                $limit = ' LIMIT '.$da.', '.$fdd; 
            } 
            else 
                $limit = ' LIMIT 0, '.$fdd; 
    
            // eseguo la query che restituisce il blocco di indirizzi interessato 
                $sql_blocco_indirizzi = 'SELECT email FROM newsletter '.$limit; 
                $res_blocco = mysql_query($sql_blocco_indirizzi, $conn) 
                                        or die(header('Location: '.$_SERVER['PHP_SELF'])); 
    
                $numero = mysql_num_rows($res_blocco); 
    
                while($numero>0){ 
    
                    echo '<span style="display: none"> </span>'; 
                    --$numero; 
    
                    $val = mysql_fetch_row($res_blocco); 
                    $message =& new Swift_Message($_POST['oggetto'], $testo, "text/html"); 
                    if (!($swift->send($message, trim($val[0]), "[email protected]"))){ 
                        echo "Si è verificato un errore durante l'invio dell'indirizzo ".$val[0]; 
                        exit(); 
                    } 
                    else 
                        echo $val[0].' fatto!<br />'; 
                } 
        } 
    
    //$swift->disconnect(); 
    //header('Location: esito.php?confirm=newsletter'); 
    

    ##########################################

    ob_end_clean(); 
    ob_flush(); 
    flush(); 
    
    echo '<meta http-equiv="refresh" content="0;URL=esito.php?confirm=newsletter">'; 
    
    echo '<div>'; 
    
    echo '<table class="list" style="font-size: small">'; 
        echo '<tr><td colspan="2">'; 
            echo '<div class="conferma" style="font-size: small" id="esito">L\'invio è stato effettuato con successo!</div>'; 
            echo '<br />'; 
            $op= 'gestisci_email.php'; 
        echo '<div>'; 
        echo '<a href="'.$op.'">&laquo; TORNA ALLA LISTA DELLE E-MAIL</a>'; 
        echo '</div>'; 
    echo '</td></tr>'; 
    echo '</table>'; 
    echo '</div>'; 
    
    // includo la coda 
    require 'coda.php'; 
    

    ?>