problema script invio email multiplo

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
Salve, ho sulla base di un tutorial messo a punto il seguent script che mi permette di inviare email a più destinatari. Attraverso un form ho la possibilità di scegliere l'email mittente da utilizzare, il database dove sono presenti le email e l'oggetto e il messaggio.
Lo script completo è in allegato.
Ora ho due problemi:
1. l'invio di email avviene in blocchi da 50, una volta inviate le prime 50 passerà al newblocco di altre 50 e cosi via. Fino ad arrivare all'ultima email presente nel file.
Il problema è che mi invia solo le prime 50 email e non ripeto il ciclo. L'errore dovrebbe essere nel cookie ma non so dove? :confused:
2. Ho inserito un if per il controllo dell'esistenza del database. Ora se non c'è il database mi stampa un messaggio
if (!file_exists($db)) {echo "Non esiste il database $dbase.txt. Non è possibile inviare email"; //verifica se il database esiste, in caso negativo termina
break;}

altrimenti deve procedere all'invio delle email e alla fine dell'invio stampare il messaggio
echo "La tua email è stata inviata con successo";
Ora se il database non esiste ho il messaggio ed è tutto ok, ma se esiste il database procede all'invio delle email ma alla fine anzichè darmi il messaggio che l'invio è avvenuto ho il messaggio di inesistenza del database.

Sono alle prime armi con il php e facilmente mi perdo anche in un bicchiere d'acqua. se qualcuno mi può aiutare gli sarò grata.
 

Allegati

Sinceramente quello script non mi piace neanche un po'. Lo sto completamente riscrivendo, completo di commenti. Se mi fornisci le specifiche posso sapere meglio come lavorare.

EDIT: Ecco. Questa è una versione basilare che non riceve dati da nessun form, però è un attimo adattarla. In questo caso non imposta nessun cookie, ma l'invio avviene in una sola esecuzione. Tuttavia, ogni 10 e-mail aspetta 5 secondi. Puoi modificare questo limite. Fammi sapere se ti va bene!
PHP:
<?php
// definisci il nome del file database
$database = 'emails.txt';

// definisci i dati del messaggio
$from = '[email protected]';
$subject = 'Messaggio di prova';
$message = 'Questo è solo un messaggio per provare lo script di invio e-mail di massa.';

// controlla che il database esista
if(!file_exists($database))
	die('Impossibile trovare il database. Controlla il percorso e riprova.');

// ottiene i dati del file
$emails = file($database);

// imposta il counter
$count = 0;

// cicla le linee nel file
foreach($emails as $line => $text)
{
	// tenta di inviare l'e-mail
	if(mail($text, $subject, $message, "From: {$from}"))
	{
		// visualizza il messaggio di avvenuto invio
		echo "Messaggio inviato correttamente a <b>{$text}</b>! <br />";
	}
	else
	{
		// visualizza il messaggio di errore
		echo "Impossibile inviare il messaggio a <b>{$text}</b>! <br />";
	}
	
	// se questa e-mail è multiplo di 10
	if($count % 10 == 0)
	{
		// attende per 5 secondi
		sleep(5000);
	}
	
	// incrementa il counter
	$count++;
}
?>
 
Ultima modifica:
Domani testo lo script cosi come lo hai costruito tu visto l'ora e le batterie quasi esaurite e farò sapere. Grazie
 
Ho modificato lo script in questo modo:
PHP:
// definisci il nome del file database
$dbase = $_POST["dbase"];
$db = 'db/'."$dbase".'.txt';

// definisci i dati del messaggio
$from = $_POST["mittente"];
$subject = $_POST["oggetto"];
$message = $_POST["messaggio"];

// controlla che il database esista
if(!file_exists($db))
    die('Impossibile trovare il database. Controlla il percorso e riprova.');

// ottiene i dati del file
$emails = file($db);

// imposta il counter
$count = 0;

// cicla le linee nel file
foreach($emails as $line => $text)
{
    // tenta di inviare l'e-mail
    if(mail($text, $subject, $message, "From: {$from}"))
    {
        // visualizza il messaggio di avvenuto invio
        echo "Messaggio inviato correttamente a <b>{$text}</b>! <br />";
    }
    else
    {
        // visualizza il messaggio di errore
        echo "Impossibile inviare il messaggio a <b>{$text}</b>! <br />";
    }
    
    // se questa e-mail è multiplo di 10
    if($count % 30 == 0)
    {
        // attende per 5 secondi
        sleep(5000);
    }
 
    // incrementa il counter
    $count++;
}

i dati vengono recuperati da un form, il cui codice è:
HTML:
    <form method="POST" enctype="multipart/form-data" action="send.php">
    <label>E-mail Mittente</label><br />
    <select name="mittente">
    <option value="[email protected]">Marketing</option>
    <option value="[email protected]">Mio sito</option>
    <option value="...">...</option>
    </select><br />
    <br />
    <label>Nome del database</label><br />
    <input type="text" size="50" name="dbase"><br />
    <br />
    <label>Oggetto</label><br />
    <input type="text" size="50" name="oggetto"><br />
    <br />
    <label>Testo e-mail</label><br />
    <textarea name="messaggio" rows="30" cols="80"></textarea><br />
    <br />

    <input type="submit" value="invia messaggio">
    </form>

Ora il mio problema è che dal file di testo che corrisponde alla variabile $db devo recuperare le email presenti che sono nella colonna 7
(campi: id|ente|responsabile|indirizzo|cap|citta|prov|email|sito|)

Non ho molta dimestichezza con foreach e quindi non so come agire.
Credo che bisogna usare explode ma partendo da quale variabile? Ho usato $text
...
PHP:
foreach($emails as $line => $text)
{
      $campiriga = explode("|",$text);
      $destinatario = $campiriga[7];
...


ma mi invia solo una email e poi si blocca
 
Mi sono un pò espressa male, in realtà non si blocca ma clicco su invia e la barra sotto che ti indica che sta caricando qualcosa arriva verso la metà e sembra fermarsi anche se continua ad esserci la clessidra.
Non gli ho dato tanto peso a questo problema perchè penso che sia un pò dovuto al fatto che non considera tutta la riga e non solo il campo email, volevo risolvere prima questo aspetto per poi verificare l'altro. Il campo email è proprio 7 appunto perchè ho considerato anche 0, altrimenti sarebbe colonna 8.
 
Il file di testo con le email di prova sono 6 email. Ho effettuato alcune modifiche ed ora per il file di testo con le 6 email va bene. Allora ho cercato di inviare le email effettive che sono circa 100 ed è molto lento, le sto ancora inviando. Vorrei fare un tentativo di invio eliminando la parte di attesa di 2 secondi dopo 30 email. Modificando questa parte ho velocizzato la cosa.
Lo script modificato è:

PHP:
<?php
// definisci il nome del file database
$dbase = $_POST["dbase"];
$db = 'db/'."$dbase".'.txt';

// definisci i dati del messaggio
$from = $_POST["mittente"];
$subject = $_POST["oggetto"];
$message = $_POST["messaggio"];

// controlla che il database esista
if(!file_exists($db))
    die('Impossibile trovare il database. Controlla il percorso e riprova. Ritorna al <a href="mail.php">modulo</a>');

// ottiene i dati del file
$emails = file($db);

// imposta il counter
$count = 0;

// cicla le linee nel file
foreach($emails as $line => $text)
{
    $campiriga = explode("|",$text);
    $destinatario = $campiriga[7];
    // tenta di inviare l'e-mail
    if(mail($destinatario, $subject, $message, "From: {$from}"))
    {
        // visualizza il messaggio di avvenuto invio
        echo "Messaggio inviato correttamente a <b>{$destinatario}</b>! <br />";
    }
    else
    {
        // visualizza il messaggio di errore
        echo "Impossibile inviare il messaggio a <b>{$destinatario}</b>! <br />";
    }

    // se questa e-mail è multiplo di 10
    if($count > 30)
    {
        // attende per 5 secondi
        sleep(2000);
    }
 
    // incrementa il counter
    $count++;
}

?>
 
Ho tolto dallo script del precedente messaggio la parte
PHP:
   // se questa e-mail è multiplo di 10 
    if($count > 30) 
    { 
        // attende per 5 secondi 
        sleep(2000); 
    }

e non ho più problemi con il tempo di invio. Si può anche eliminare dato che più di 100 email sono state inviate in pochi secondi.
Grazie dell'aiuto
 

Discussioni simili