Visualizzazione risultati 1 fino 6 di 6

Discussione: Newsletter: problema olte le 6 mail

  1. #1
    Guest

    Predefinito Newsletter: problema olte le 6 mail

    Lo so, di non essere il primo ad avere questo tipo di problema. Ci sono fior di 3d su questo forum che accusano gli stessi problemi. Ma non ho tovato la soluzione, soprattutto perché un 3d contaddice l'altro.
    Avviene che io gestisco una newsletter, al momento con una settantina di iscritti. Il codice che si occupa di mandare le mail è il seguente:

    Codice PHP:
    <?
    if($_POST['azione']=='Invia'){
    $tempo = 3; #Tempo di attesa tra un invio e l'altro
    $da = "From: Liceo di Lugano 1 <lilu1@altervista.org>";
    $header = scrivi_header($da);
    $row_titolo = mysql_fetch_array(mysql_query("SELECT * FROM intestazione WHERE nome='titolo'", $db));
    $oggetto = "[Newsletter Liceo Lugano 1] " . $row_titolo['valore'];
    $result = mysql_query ("SELECT * FROM newsletter_registrati", $db);
    while (
    $row = mysql_fetch_array($result)){
    $a = $row['email'];
    if(
    mail($a, $oggetto, $integrale, $header)){
    echo
    "Mail inviata a $a!<br>";
    }else{
    echo
    "Problema nell'invio a $a!<br>";
    }
    sleep($tempo);
    }
    }
    Fino a ieri il tempo di attesa era di 1,5 secondi, che mi risultavano sufficienti, visto che in un 3d cui avevo preso parte si consigliava almeno sette decimi di secondo, essendo il limite tre email ogni due secondi. Ma anche così non ha funzionato.
    Ora ho tentato un'altra cosa: mi sono registato io una settantina di volte, sempre con lo stesso indirizzo, su una tabella di prova e ho mandato la newsletter solo a quelli iscritti nella nuova tabella (quindi solo io, ma settanta volte). Il risultato è che io ho ricevuto, invece delle attese settanta email, solo 17 e la pagina, invece di dire email mandata a questo, problema con quello, è vuota. Che ci sia un timeout? Quanto tempo devo mettere ta un invio e l'altro? Vorrei evitare di mandare una sola email con un destinatario e settanta copie per conoscenza.

  2. #2
    Guest

    Predefinito

    mi sembra (nel caso controllatelo con un php_info();) che il timeout sia sui 30-60 secondi (ora faccio davvero confusione con altri server), potresti mettere un $i++ e arrivato a tot $i ricarichi la pagina e parti da dov'eri arrivato...
    ciao!

  3. #3
    L'avatar di funcool
    funcool non è connesso Utente storico
    Data registrazione
    05-02-2004
    Residenza
    Qui... Non lì, qui!
    Messaggi
    15,433

    Predefinito

    Oppure puoi mettere tutti gli indirizzi nel campo BCC così mandi un'unica e-mail.
    Mattia vi manda a FunCool - Matriz - Directory Gogol - Sfondo rosso per la Birmania
    «Tu mi dai fastidio perché ti credi tanto un Dio!» «Bè, dovrò pur prendere un modello a cui ispirarmi, no?» Woody Allen

  4. #4
    Guest

    Predefinito

    Citazione Originalmente inviato da funcool
    Oppure puoi mettere tutti gli indirizzi nel campo BCC così mandi un'unica e-mail.
    Ecco, quando dicevo "Vorrei evitare di mandare una sola email con un destinatario e settanta copie per conoscenza." Intendevo proprio quello. Comunque dovrei aver risolto. Posto il codice (non l'ho ancora provato) e, se c'è qualcosa che non va, potete segnalarmelo.

    Codice PHP:
    if($_POST['azione'] == 'Invio'){
    //Imposto le variabili di sessione per l'invio delle mail
    $_SESSION['mail'] = array(
    'i' => 0,
    'titolo' => $_POST['titolo'],
    'testo' => $_POST['testo'],
    'azione' => 'invio',
    'ok' => array(),
    'ko' => array()
    );
    die (
    '<meta http-equiv="refresh" content="0">');
    }


    if(
    $_SESSION['mail']['azione'] == 'invio'){
    //Invio di un blocco di 25 mail
    $i = $_SESSION['mail']['i'];
    $query = "SELECT * FROM newsletter_registrati LIMIT $i,25";
    $result = mysql_query ($query, $db);
    $num_rows = mysql_num_rows($result);
    if(
    $num_rows == 0)
    die (
    '<meta http-equiv="refresh" content="0; URL=inviofinito.php"');
    while (
    $row = mysql_fetch_array($result)){
    //mail(a, oggetto, testo, headers)
    $a = $row['email'];
    $oggetto = "[Newsletter lilu1] - " . $_SESSION['mail']['titolo'];
    $testo = $_SESSION['mail']['testo'];
    $da = "From: Liceo di Lugano 1 <lilu1@altervista.org>";
    $headers_mail = scrivi_header($da);
    if(
    mail($a, $oggetto, $testo, $headers_mail))
    $_SESSION['mail']['ok'][] = $a;
    else
    $_SESSION['mail']['ko'][] = $a;
    $i++;
    sleep(2);
    }
    if(
    $num_rows < 25){
    $_SESSION['mail']['azione'] = 'finito';
    die (
    '<meta http-equiv="refresh" content="0;URL=inviofinito.php">');
    }else{
    $_SESSION['mail']['azione'] = 'invio";
    $_SESSION['
    mail']['i'] ? $i;
    die('
    <meta http-equiv="refresh" content="0">');
    }
    }
    (scrivi_header() è una funzione personalizzata che crea una stringa da passare come header per l'invio in HTML e altre cosette.)

    Se è la prima volta che si apre la pagina, vuol dire che nella variabile POST ci sono i dati che mi danno il titolo, il testo dell'email e l'input di iniziare. Allora io salvo tutto in una variabile di sessione (l'ho aperta, la sessione...) e refresho la pagina. La seconda volta, e le successive, controllo se c'è la variabile di sessione, ricavo le informazioni circa titolo e testo, ricavo dal database (hoi anche già aperto la connessione) i primi 25 indirizzi a partire dalla variabile i che incrementa ogni volta che mando un'email. Poi, mandate 25 email (= circa a 50-55 secondi), salvo tutto nelle variabili di sessione e refresho la pagina, finché il numero di indirizzo presi è minore di 25: allora significa che gli indirizzi sono finiti e passo a un'altra pagina, che elenca il contenuto delle variabili ok e ko di sessione (in ok ci sono gli invii andati a buon fine e in ko gli altri).
    Appena posso provo e poi riferisco.
    Ultima modifica di lilu1 : 29-09-2006 alle ore 12.26.35

  5. #5
    Ospite Guest

    Predefinito

    Bravo... Dopo riferisci che interessa parecchio pure me questo discorso per le mail...

  6. #6
    Guest

    Smile Sììììì! Funziona!!!!

    Appunto! Funziona tutto. Non nascondo la mia gioia, anzi!
    Però forse sarebbe meglio adottare una tattica più "conservatrice": il mio script manda 25 email a ogni refresh; forse sarebbe meglio mandarne solo 20. Ma ci vuole poco a cambiare. Se qualcuno fosse interessato, scriverò appena avrò un attimo di tempo copierò sul forum il codice essenziale delle tre pagine implicate nell'invio con i dovuti commenti. A presto.


    EDIT: Ecco il codice usato. Ci sono tre files: finale.php, invio.php e inviofinito.php.

    Codice PHP:
    <!-- File: finale.php -->
    <form action="invio.php" method="post">
    <input type="hidden" name="testo" value='<? print $integrale; ?>'>
    <input type="hidden" name="titolo" value='<? print $titolo; ?>'>
    <input type="submit" name="azione" value="Invia">
    </form>
    Ovviamente, in questo file sono già state impostate alcune variabili, che sono $testo, col testo da inviare e $titolo con il titolo, che sarà poi integrato nell'oggetto dell'email.


    Codice PHP:
    <?
    //File: invio.php
    session_start();
    include(
    "../config.inc.php");
    $db = connetti();

    if(
    $_POST['azione'] == 'Invia'){
    //Imposto le variabili di sessione per l'invio delle mail
    $_SESSION['mail'] = array(
    'i' => 0,
    'titolo' => $_POST['titolo'],
    'testo' => $_POST['testo'],
    'azione' => 'invio',
    'ok' => array(),
    'ko' => array()
    );
    die (
    '<meta http-equiv="refresh" content="0">');
    }


    if(
    $_SESSION['mail']['azione'] == 'invio'){
    //Invio di un blocco di 25 mail
    $i = $_SESSION['mail']['i'];
    $query = "SELECT * FROM newsletter_registrati LIMIT $i,25";
    $result = mysql_query ($query, $db);
    $num_rows = mysql_num_rows($result);
    if(
    $num_rows == 0){
    $_SESSION['mail']['azione'] = 'finito';
    die (
    '<meta http-equiv="refresh" content="0;URL=inviofinito.php">');
    }
    while (
    $row = mysql_fetch_array($result)){
    //mail(a, oggetto, testo, headers)
    $a = $row['email'];
    $oggetto = "[Newsletter lilu1] - " . $_SESSION['invio']['titolo'];
    $testo = $_SESSION['testo'];
    $da = "From: Liceo di Lugano 1 <lilu1@altervista.org>";
    $headers_mail = scrivi_header($da);
    if(
    mail($a, $oggetto, $testo, $headers_mail))
    $_SESSION['mail']['ok'][] = $a;
    else
    $_SESSION['mail']['ko'][] = $a;
    $i++;
    sleep(2);
    }
    if(
    $num_rows < 25){
    $_SESSION['mail']['azione'] = 'finito';
    die (
    '<meta http-equiv="refresh" content="0;URL=inviofinito.php">');
    }else{
    $_SESSION['mail']['azione'] = 'invio';
    die(
    '<meta http-equiv="refresh" content="0">');
    }
    }
    ?>
    In questo file ci sono due funzioni che sono definite nel file config.inc.php, che sono connetti(), che si connette al database e sceglie il database my_lilu1 e scrivi_header(), che, dato il mittente dell'email, restituisce una stringa contenente anche gli headers per l'invio in HTML.


    Codice PHP:
    <?
    //File: inviofinito.php
    session_start();
    include(
    "../config.inc.php");
    $login = controllo_login('crealogin');
    $db = connetti();

    if(
    $_SESSION['mail']['azione'] != 'finito'){
    die (
    "Che cacchio ci fai qui?");
    }

    ?>

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html lang="it-ch">
    <head>
    <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
    <title>Sezione riservata</title>
    </head>
    <body>

    <?
    //Visualizzo il contenuto della variabile mail di sessione
    echo "<!--\n\n";
    print_r($_SESSION['mail']);
    echo
    "\n\n-->";
    //Visualizzazione del contenuto completata
    ?>

    <?
    //Visualizzo il rapporto sulle email mandate
    $ok = $_SESSION['mail']['ok'];
    $ko = $_SESSION['mail']['ko'];
    echo
    "<p>";
    foreach (
    $ok as $num => $email){
    echo
    $num . " - Mail inviata correttamente a: " . $email . "<br>\n";
    }
    echo
    "</p><p>";
    foreach (
    $ko as $num => $email){
    echo
    $num . " - Problema nell'invio a: " . $email . "<br>\n";
    }
    echo
    "</p>";
    //Finito il rapporto
    ?>
    Quest'ultimo file visualizza il rapporto. Nel caso in cui la variabile di sessione $_SESSION['mail']['azione'] non valga "finito", significa che chi è arrivato in quella pagina non aveva nessun motivo per andarci, e quindi visualizzo un messaggio di errore ("Che cacchio ci fai qui?") ed esce.

    Se qualcuno volesse avere altre informazioni o apportare correzioni, può postare qui.


    FunCool: Non fare UP, usa il tasto Edita.
    Ultima modifica di funcool : 30-09-2006 alle ore 11.01.24

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •