Invio e-mail tramite Swift e Internal Server Error

Discussione in 'PHP' iniziata da Tavrotto, 21 Agosto 2008.

Tag (etichette):
  1. Tavrotto

    Tavrotto Nuovo Utente

    Registrato:
    18 Marzo 2007
    Messaggi:
    4
    Mi Piace Ricevuti:
    0
    Punteggio:
    0
    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, postmaster@miosito.it 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

    --------------------------------------

    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 = 'http://www.miosito.ext/';

    // 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]), "info@miosito.ext"))){
    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.'">« TORNA ALLA LISTA DELLE E-MAIL</a>';
    echo '</div>';
    echo '</td></tr>';
    echo '</table>';
    echo '</div>';

    // includo la coda
    require 'coda.php';

    ?>
     
  2. Eliox

    Eliox Utente Attivo

    Registrato:
    25 Febbraio 2005
    Messaggi:
    4.390
    Mi Piace Ricevuti:
    3
    Punteggio:
    0
    Potrebbe non essere un problema dello script, tu hai settato a 900 il massimo tempo di esecuzione degli script per PHP; ma qual'è il massimo tempo di esecuzione per Apache o per il Web server se è un altro?
     
  3. Tavrotto

    Tavrotto Nuovo Utente

    Registrato:
    18 Marzo 2007
    Messaggi:
    4
    Mi Piace Ricevuti:
    0
    Punteggio:
    0
    Il massimo tempo di esecuzione per Apache penso sia personalizzabile tramite la funzione ini_set('max_execution_time', $met); che "sovrascrive" il parametro max_execution_time nel file di configurazione del server..

    Ho provato anche ad impostarlo semplicemente a 300 (5 minuti)
    ma il risultato è lo stesso...

    E' ormai molto che cerco di risolvere questo problema ma sinceramente non so più dove sbattere la testa :crying:

    Grazie
     
  4. dynamytech

    dynamytech Nuovo Utente

    Registrato:
    26 Settembre 2008
    Messaggi:
    1
    Mi Piace Ricevuti:
    0
    Punteggio:
    0
    Ciao Tavrotto,
    purtroppo non ho la soluzione però anche io ho lo stesso problema per uno script di crawling che gira sempre su hosting linux nei server aruba.

    all'inizio dello scritp ho impostato questi valori

    set_time_limit(1000);
    ini_set("max_execution_time","1000");
    ini_set("max_input_time","1000");
    ini_set("memory_limit","200M");
    $_SERVER['HTTP_KEEP_ALIVE ']="1000";

    ma inutilmente, infatti ogni volta che lo mando in esecuzione dopo un pò di tempo mi viene restituito internal server error, però ho notato una cosa importante, in pratica per fare il crawling delle pagine del sito uso il mysql e ogni link che becco lo inserisco nel db. Quello che ho notato è che pur ricevendo Internal Server Error, lo script continua a girare infatti i link nel db continuano ad aumentare anche nel mentre ho ricevuto l'errore sul browser. I record aumentano fino ad essere indicizzati tutti.
    A questo punto credo che la soluzione vada cercata nel far rimanere il browser in attesa visto che comunque lo script continua a girare nel server!! altrimenti i link nel db non verrebbero aggiunti anche in seguito fino ad indicizzazione completata.
    Se trovo qualcosa di nuovo ti faccio sapere.
    Ciao ciao!
     
Sto caricando...

Condividi questa Pagina