• User Attivo

    inviare una mail con php

    salve a tutti, ho creato un file.php per creare una specie di newsletter.
    il file dovrebbe prendere gli indirizzi mail da un file esterno (mail.txt) e metterli nel bcc (in modo che i vari destinatari non vedano le mail degli altri).
    in più questo codice dovrebbe inserire nel testo della mail una pagina html (php.html).
    il problema è che non funziona lo script, mi da "errore: mail non inviata" come scritto nell'else dell'if alla fine.
    io purtroppo non ne capisco molto, quindi l'ideale sarebbe che qualcuno lo correggesse e lo scrivesse già sistemato!
    so di chiedere troppo, ma davvero non so dove mettere le mani!
    grazie mille!

    ecco il codice (scusate, ci sono anche i commenti...):

    [php]
    <body>
    <?php
    $mitt=$_POST["from"];
    echo $mitt . "<br>";
    $destin=$_POST["to"];
    echo $destin . "<br>";
    $ogg=$_POST["oggetto"];
    echo $ogg . "<br>";
    //leggo i destinatari da un file esterno
    $myFile = "mail.txt";
    //controlliamo che il file esista
    if (file_exists($myFile)) { //se il file esiste. è booleana, risp TRUE o FALSE
    //se esiste, copia il contenuto del file in una stringa.
    //se esiste dobbiamo dargli una serie di istruzioni
    $fp = fopen($myFile, "r"); //apre il file. gli dico il nome del file. "r" significa apri il file in sola lettura, read only. ci sono una serie di altre modalità: w (write) con sostituzione del file: scrivo ma cancello quello che c'era dentro, a (appened) vado ad appendere, scrivo dall'ultima riga in poi senza distruggere quello che c'è dentro. in questo caso dobbiamo solo leggere.
    //fopen legge il file e restituisce una variabile che si chiama fp. è un PUNTATORE (contiene l'indirizzo della variabile), cioè contiene l'indirizzo di memoria codificato della locazione iniziale del file aperto: puntatore perchè punta all'inizio del file.
    //finora in questo modo gli ho detto se il file esiste, aprilo
    //devo leggere il contenuto del file, concatenare i contenuti, creare una stringa che verrà restituita al file.
    //utilizzo la funzione fgets alla quale applico l'indirizzo del file. lui mi va a prendere la prima riga del file, il primo indirizzo email, che viene immagazzinato nella stringa $current_line
    $current_line = fgets($fp);
    //ora mi vado a settare la variabile $dest. in php per fare una lista di mail non si usa ; ma ,
    $destin=$current_line.","; //abbiamo preso la prima mail $current_line e l'abbiamo concatenato con una virgola. finora ho estratto il primo destinatario
    //la sintassi di questa funzione fgets dice che devo prendere la prima riga e poi con un ciclo while devo andare a leggere tutte le altre. la funzione fgets non ha bisogno dell'incremento. legge la riga che trova e passa direttamente al successivo. quindi nel while non ci sarà bisogno dell'incremento perchè è la funzione fgets che passa in automatico alla riga di memoria successiva
    //la funzione feof è una funzione booleana che mi dice se ho raggiunto la fine del file. se all'indirizzo $fp il file incontra la fine
    while (!feof($fp)){
    $current_line = fgets($fp);
    $destin=$destin. $current_line . ",";
    } //finchè non ho raggiunto la fine del file rileggo la linea corrente e la vado ad aggiungere alla variabile $destin che ho settato prima. in questo modo quando il while sarà finito, avrò settato nella variabile $destin tutti i destinatari. così legge, concatena...
    // a questo punto ho una variabile che contiene tutti gli indirizzi separati da una virgola. tramite il while ora $fp contiene il puntatore all'ultima locazione di memoria del file.
    fclose($fp); //chiude il file
    echo $destin; //fa vedere a schermo tutti gli indirizzi di posta separati da una virgola
    //ho estratto tutti gli indirizzi dal file, li ho concatenati in una stringa, ora devo inviare la mail.
    $headers = "From: <$mitt>\n"; //inserisco nell'headers il mittente
    $headers .= "Content-type: text/html; charset=iso-8859-1\n"; //assegno come linguaggio l'html e come caratteri quelli occidentali. /plane è la variante di html per i caratteri ascii

    $myMail = "php.html"; //la pagina html da inviare
    //controlliamo che il file esista
    if (file_exists($myMail)) { //se il file esiste. è booleana, risp TRUE o FALSE
    $handle = fopen($myMail, "r");
    //non mi serve la funzione fgets perchè non devo leggere le righe una per una. uso la funzione fread che riceve due parametri: $handle che riceve l'indirizzo della posizione del file, il puntatore. il secondo parametro filesize di myfile che è una funzione che, applicata al nome del file, mi restituisce la grandezza totale in byte del file. il fatto che ci metto la grandezza serve per dire che magari voglio che prenda solo i primi 4 kb. potrei aprirne solo un pezzo. mentre per aprirlo tutto devo sapere quanto pesa. e la grandezza totale si ricava con la funzione filesize.
    $mess = fread($handle, filesize($myMail)); //$mess è la variabile di ritorno, il contenuto del file. se fopen apre, fread legge. il contenuto della lettura viene messo nella variabile $mess. alla fine dell'operazione $mess conterrà tutto il contenuto del file.
    fclose($handle);//chiudi il file. la variabile $handle che conterrà il puntatore alla fine del file
    }//cioè, se il file esiste, lo apri, lo leggi e lo chiudi
    $headers = "From: <$mitt>\n"; //inserisco nell'headers il mittente
    $headers .= "Bcc: <$destin>\n";
    $headers .= "Content-type: text/html\n";
    $headers .= "charset=iso-8859-1\n";
    //a questo punto mando la mail. adesso la variabile $mess contiene tutto il file che ho letto

    if(mail("", $ogg, $mess, $headers)){ //il mittente è contenuto nell'headers
    echo "<br/>invio avvenuto con successo.";
    }
    else{
    echo "<br/>errore: e-mail non inviata.";
    }
    }
    ?>
    </body>
    </html>
    [/php]


  • User Attivo

    boh,

    a me pare un casino. ti ocnviene usare phpmailer.

    è molto meglio!


  • User Attivo

    ho iniziato a vederlo un po' senza entrare nello specifico ma sembra davvero l'ideale!
    grazie mille!
    cmq se qualcuno lo stesso sa risolvermi questo codice mi farebbe un favore enormissimo!
    grazie!


  • User Attivo

    prova cosi, se funziona ti dico cosa era sbagliato.

    <?php 
    $mitt=$_POST["from"]; 
    echo $mitt . "<br>"; 
    $destin=$_POST["to"]; 
    echo $destin . "<br>"; 
    $ogg=$_POST["oggetto"]; 
    echo $ogg . "<br>"; 
    //leggo i destinatari da un file esterno 
    $myFile = "mail.txt"; 
    //controlliamo che il file esista 
    if (file_exists($myFile)) { //se il file esiste. è booleana, risp TRUE o FALSE 
    //se esiste, copia il contenuto del file in una stringa. 
    //se esiste dobbiamo dargli una serie di istruzioni 
    $fp = fopen($myFile, "r"); //apre il file. gli dico il nome del file. "r" significa apri il file in sola lettura, read only. ci sono una serie di altre modalità: w (write) con sostituzione del file: scrivo ma cancello quello che c'era dentro, a (appened) vado ad appendere, scrivo dall'ultima riga in poi senza distruggere quello che c'è dentro. in questo caso dobbiamo solo leggere. 
    //fopen legge il file e restituisce una variabile che si chiama fp. è un PUNTATORE (contiene l'indirizzo della variabile), cioè contiene l'indirizzo di memoria codificato della locazione iniziale del file aperto: puntatore perchè punta all'inizio del file.  
    //finora in questo modo gli ho detto se il file esiste, aprilo 
    //devo leggere il contenuto del file, concatenare i contenuti, creare una stringa che verrà restituita al file. 
    //utilizzo la funzione fgets alla quale applico l'indirizzo del file. lui mi va a prendere la prima riga del file, il primo indirizzo email, che viene immagazzinato nella stringa $current_line 
    $current_line = fgets($fp);  
    //ora mi vado a settare la variabile $dest. in php per fare una lista di mail non si usa ; ma , 
    $destin=$current_line.","; //abbiamo preso la prima mail $current_line e l'abbiamo concatenato con una virgola. finora ho estratto il primo destinatario 
    //la sintassi di questa funzione fgets dice che devo prendere la prima riga e poi con un ciclo while devo andare a leggere tutte le altre. la funzione fgets non ha bisogno dell'incremento. legge la riga che trova e passa direttamente al successivo. quindi nel while non ci sarà bisogno dell'incremento perchè è la funzione fgets che passa in automatico alla riga di memoria successiva 
    //la funzione feof è una funzione booleana che mi dice se ho raggiunto la fine del file. se all'indirizzo $fp il file incontra la fine 
    while (!feof($fp)){ 
    $current_line = fgets($fp); 
    $destin=$destin. $current_line . ","; 
    } //finchè non ho raggiunto la fine del file rileggo la linea corrente e la vado ad aggiungere alla variabile $destin che ho settato prima. in questo modo quando il while sarà finito, avrò settato nella variabile $destin tutti i destinatari. così legge, concatena... 
    // a questo punto ho una variabile che contiene tutti gli indirizzi separati da una virgola. tramite il while ora $fp contiene il puntatore all'ultima locazione di memoria del file. 
    fclose($fp); //chiude il file 
    echo $destin; //fa vedere a schermo tutti gli indirizzi di posta separati da una virgola 
    //ho estratto tutti gli indirizzi dal file, li ho concatenati in una stringa, ora devo inviare la mail. 
    $headers = "From: <$mitt>\n"; //inserisco nell'headers il mittente 
    $headers .= "Content-type: text/html; charset=iso-8859-1\n"; //assegno come linguaggio l'html e come caratteri quelli occidentali. /plane è la variante di html per i caratteri ascii 
     
    $myMail = "php.html"; //la pagina html da inviare 
    //controlliamo che il file esista 
    if (file_exists($myMail)) { //se il file esiste. è booleana, risp TRUE o FALSE 
    $handle = fopen($myMail, "r");  
    //non mi serve la funzione fgets perchè non devo leggere le righe una per una. uso la funzione fread che riceve due parametri: $handle che riceve l'indirizzo della posizione del file, il puntatore. il secondo parametro filesize di myfile che è una funzione che, applicata al nome del file, mi restituisce la grandezza totale in byte del file. il fatto che ci metto la grandezza serve per dire che magari voglio che prenda solo i primi 4 kb. potrei aprirne solo un pezzo. mentre per aprirlo tutto devo sapere quanto pesa. e la grandezza totale si ricava con la funzione filesize. 
    $mess = fread($handle, filesize($myMail)); //$mess è la variabile di ritorno, il contenuto del file. se fopen apre, fread legge. il contenuto della lettura viene messo nella variabile $mess. alla fine dell'operazione $mess conterrà tutto il contenuto del file. 
    fclose($handle);//chiudi il file. la variabile $handle che conterrà il puntatore alla fine del file 
    }//cioè, se il file esiste, lo apri, lo leggi e lo chiudi 
    $headers .= "From: <$mitt>\n"; //inserisco nell'headers il mittente 
    $headers .= "Bcc: <$destin>\n"; 
    $headers .= "Content-type: text/html\n"; 
    $headers .= "charset=iso-8859-1\n"; 
    //a questo punto mando la mail. adesso la variabile $mess contiene tutto il file che ho letto 
     
    if(mail("", $ogg, $mess, $headers)){ //il mittente è contenuto nell'headers 
    echo "<br/>invio avvenuto con successo."; 
    } 
    else{ 
    echo "<br/>errore: e-mail non inviata."; 
    } 
    } 
    ?> 
    

  • User Attivo

    no, non funziona nemmeno così!!! mi da sempre la stessa risposta! scrive a video gli echo iniziali delle variabili e poi mi dà l'errore...
    cmq, per usare phpmailer il mio pc dev'essere server o non c'è bisogno?