Una classe per inviare e-mail

Scritto da loige

Spesso nelle nostre pagine php abbiamo la necessità di inviare delle e-mail. Questa operazione, sebbene non particolarmente complicata in php grazie alla presenza della funzione mail(), richiede spesso diverse linee di codice, in particolar modo se volete impostare correttamente gli header per poter inviare l’ e-mail in formato HTML. Di conseguenza se in un vostro sito avete la necessità frequente di inviare e-mail potreste ritrovarvi con un bel po’ di codice duplicato e stilisticamente poco elegante. Per risolvere questo problema possiamo implementare una classe che ci permetta di creare ed inviare agevolmente e-mail preoccupandoci solo di gestire il contenuto, formato e destinatari.

Progettiamo la classe

Innanzitutto la prima cosa da fare e prevedere quali dovranno essere i metodi e gli attributi necessari a svolgere il compito desiderato. Tracciamone un elenco:

Attributi

  • Indirizzo web del sito da cui inviare il messaggio
  • Nome del mittente
  • Indirizzo e-mail del mittente
  • Un array di indirizzi dei destinatari
  • L’oggetto dell’ e-mail
  • Il testo dell’e-mail
  • Una variabile booleana utile ad indicare se vogliamo inviare il messaggio di posta in formato html o come testo semplice

Metodi

  • Un costruttore per settare i parametri iniziali
  • Un metodo per impostare le informazioni sul mittente
  • Un metodo per impostare il soggetto dell’e-mail
  • Un metodo per inserire il testo dell’ e-mail e specificarne il formato
  • Un metodo per aggiungere uno o più destinatari all’elenco dei destinatari
  • Un metodo per ripulire la lista dei destinatari
  • Un metodo per spedire la nostra e-mail

In seguito vedremo che saranno utili anche alcune costanti.

Il codice

Diamo adesso una rapida occhiata a tutto il codice che compone la nostra classe e poi commentiamo i singoli blocchi separatamente.

 
<?
/*
     class: sendMail
     Classe che permette di inviare agevolmente messaggi di posta elettronica
     
     - Author: Luciano M <loige[at]hotmail.com>
     - Version: 1.0 proBlog Edition
     
    */
 
    class sendMail
    {
        
        /* Varie costanti di supporto */
        var $mime = “MIME-Version: 1.0″;
        var $contentTypePlain = “text/plain”;
        var $contentTypeHtml = “text/html”;
        var $charset = “iso-8859-1″;
        
        /* Attributi */
        var $isHtml = true;
        
        var $website;
        var $senderName;
        var $senderMail;
        
        var $addressees;
        var $subject;
        var $text;
 
        
        /*
         function: sendMail
         costruttore. Imposta i parametri di default
        */
        function sendMail()
        {
            $this->addressees = array();
            $this->setSender();
            $this->setSubject();
            $this->setText();
        }
        
        /*
         function: setSender
         Permette di impostare il nome e l’indirizzo e-mail di chi invierà l’e-mail.
         Queste informazioni non sono soggette a nessun controllo di validità.
         
         Parameters:
            $senderMail - L’indirizzo e-mail del mittente
            $senderName - Il nome del mittente
        */
        function setSender($senderMail = “”, $senderName = “”)
        {
            $this->senderMail = $senderMail;
            
            if ($senderName == “”)
                $this->senderName = $senderMail;
            else
                $this->senderName = $senderName;
        }
        
        
        /*
         function: setSubject
         imposta l’oggetto dell’email.
         
         Parameters:
            $subject - l’oggetto della mail
        */
        function setSubject($subject = “”)
        {
            $this->subject = $subject;
        }
        
        
        /*
         function: setText
         imposta il testo dell’email. Permette inoltre di specificare se deve essere
         considerato come html (opzione predefinita) o come testo piano.
         
         Parameters:
            $text - il testo principale dell’email
            $isHtml - un valore booleano che indica se il testo deve essere trattato
            come codice html o come testo semplice.
        */
        function setText($text = “”, $isHtml = true)
        {
            $this->text = $text;
            $this->isHtml = $isHtml;
        }
        
        
        /*
         function: addAddresse
         permette di inserire un indirizzo email nell’elenco dei destinatari.
         L’indirizzo e-mail verrà inserito nell’elenco solo se ritenuto valido.
         
         Parameters:
            $mail - l’indirizzo email da inserire
        */
        function addAddressee($mail)
        {
                array_push($this->addressees,$mail);
        }
        
        /*
         function: clearAddressees
         Ripulisce l’elenco dei destinatari rendendolo vuoto.
        */
        function clearAddressees()
        {
            $this->addressees = array();
        }
        
        
        /*
         Funzione di supporto per costruire velocemente l’header dell’e-mail
        */
        function createHeader()
        {
            $content = “Content-type: “;
            if($this->isHtml)
                $content .= $this->contentTypeHtml;
            else
                $content .= $this->contentTypePlain; 
            $content .= “; charset={$this->charset}”;
            
            $from = “From:{$this->senderName} <{$this->senderMail}>”;
            
            $site = “X-WEBSITE: {$this->website}”;
            
            $header = “{$this->mime}\r\n{$content}\r\n{$from}\r\n{$site}”;
            
            return $header;
        }
        
        /*
         function: send
         Invia la mail utilizzando i valori settati in precedenza ( destinatari, oggetto, testo).
         
         Returns:
            Un valore booleano che indica se l’invio dell’email è andato a buon fine o meno.
        */
        function send()
        {
           $tmp = “”;
           $array = $this->addressees;
           for($i = 0; $i < sizeof($array); $i++)
           {
                 $tmp .= $array[$i];
                 if ($i != (sizeof($array) - 1))
                 $tmp .= “, “;
           }
 
            if ( mail($tmp,$this->subject, $this->text, $this->createHeader()) )
                return true;
            
            return false;
        }
        
} // fine della classe
?>

Grazie ai commenti non dovrebbe essere troppo complicato capire come funziona la classe e soprattuo come funziona ogni singolo metodo. Inoltre possiamo vedere con qualche piccolo esempio come diventa facile inviare un’ e-mail con questa classe.

Un esempio

 
<?
    require_once(“sendMail.php”);
    
    $sm = new sendMail();
    
    $sm->addAddressee(“ilmio@migliore.amico”);
    $sm->setSender(“mario@famigliarossi.com”,“Mario Rossi”);
    $sm->setSubject(“La mia email di prova per la mia classe php”);
    $sm->setText(“questa è una bella <b>email</b> di prova per farti vedere come funziona la mia classe php <i>sendMail</i>”);
    
    $sm->send();
    
 
?>

Eseguendo questo codice php verrà inviata un’ e-mail all’indirizzo ilmio@migliore.amico a nome di Mario Rossi (mario@famigliarossi.com) contente il testo specificato con la chiamata setText (nota che viene impostato automaticamente il testo come testo html in quanto è omesso il secondo parametro di setText).
E’ facile mediante questo esempio capire come adesso sia semplice inviare delle e-mail preoccupandoci di specificare solo il loro contenuto e tralasciando header ed altre complicate procedure poco rilevanti e soprattutto poco immediate.

Possibili miglioramenti

La nostra classe ovviamente può essere ancora migliorata per raggiungere un livello di maggiore completezza e funzionalità. Possiamo ad esempio integrare un controllo che validi la correttezza formale degli indirizzi e-mail prima di inserirli nell’elenco dei destinatari e potremmo ancora migliorare la gestione dei destinatari facendo in modo di aggiungere un nome descrittivo per ogni indirizzo e-mail, come avrete spesso visto nei più comuni software di gestione della posta elettronica (Ad es. “Luciano Rossi <lr@famigliarossi.com>”).
Ogni programmatore php può ovviamente trovare necessarie alcune aggiunte in base ai compiti che intende assolvere con questa classe.

Considerazioni conclusive

Questa soluzione si rivela davvero molto utile per progetti in cui volete inviare semplici notifiche o comunque e-mail non eccessivamente elaborate. Se volete invece gestire gli aspetti più approfonditi delle e-mail vi conviene utilizzare il pacchetto PEAR::Package::Mail che si rivela di certo più completo e professionale, ma anche molto più complesso.

Nella speranza di essere stato chiaro vi lascio un grosso saluto

Sponsor

17 Commenti a “Una classe per inviare e-mail”

  1. ciao mi metti questo per inviare commenti nel mio sito ?

  2. ciao

  3. Ciao Davide, innanzitutto a nome dello staff ti auguro un caloroso benvenuto in ProBlog.
    Se ho capito bene vuoi utilizzare questo nostro script per inviare commenti dal tuo sito.
    Innanzi tutto quando parli di commenti mi fa suppore che vorresti qualcosa con cui gli utenti del tuo sito web possano “lasciare” del testo nelle tue pagine e non inviarti qualcosa via mail. Per fare ciò hai bisogno non solo di uno specifico script php (da integrare in tutte le sue parti nel tuo sito web) ma anche di un database o cmq una qualsiasi altra via per poter immagazzinare i commenti ricevuti e reperirli quando necessario.
    Quindi in conclusione credo che questa classe non puo’ esserti utile ad assolvere questo compito, ma potresti integrarla in qualche sistema di commenti per far in modo che ogni qual volta dovessi ricevere un commento ti venga inviata una e-mail di notifica in automatico.
    Spero di essere stato abbastanza esaustivo e di non aver frainteso la tua richiesta.
    Torna a trovarci presto e non esitare a fare altre domande.
    Ciao.

  4. Non male la classe!
    Il php è un gran bel linguaggio speriamo che rimarrà sempre al passo con i tempi…
    Sinceramente mi sarei aspettato di vedere funzioni piu complete per inviare email con funzioni gia belle e pronte per il php…

  5. ciao a tutto il forum loige, o un messe che sto facendo il mio sito ed sono a un buon punto , ma da 6 giorni che sto impazzendo a creare un form sendmail.php girando per la rete mi sono trovato qua su http://loige.altervista.org sù questa guida che non penso che fa nel mio caso
    mi potette aiutare a fare il file php per il form del html che posto
    vi supplico non so proprio dove sbattere la testa aiutatemi
    Grazie in Anticipo

    —- form html che voglio usare e questo —–
    —————————————————————-

    Nome

    Cognome

    Azienda

    Telefono

    Fax

    Email

    Messaggio

    ———————————————————

  6. Ciao Lucas, ti scrivo un abbozzo di codice così per darti un idea, magari se hai bisogno di chiarimenti ne riparliamo ;)

    Questo è il codice che deve stare nella pagina che imposti come destinazione del form (suppongo utilizzerai il meccanismo POST per passare i dati dal form alla pagina)

    includi la classe trattata sopra nella stessa cartella in cui creerai lo script con un codice simile al seguente

     
     
    require_once(“sendMail.php”);
     
    $m = new sendMail();
    $m->setSender( $_POST[‘Email’] );
    $m->setSubject( “Messaggio inviato dal mio sito da {$_POST[’Nome’]} {$_POST[’Cognome’]}” );
    $m->addAddressee(“nome@tuosito.it”);
     
    $text = “Mittente: {$_POST[’Nome’]} {$_POST[’Cognome’]} <br/> Azienda: {$_POST[’Azienda’]}<br/>
                Telefono: {$_POST[’Telefono’]} / Fax: {$_POST[’Fax’]} / Email: {$_POST[’Email’]}<br/>
                <br/>Messaggio:<br/>{$_POST[’Messaggio’]}”;
     
    $m->setText($text);
     
    if ($m->send)
          echo(” Il messaggio di posta è stato inviato correttamente “);
     

    Ti ripeto che il codice sopra è solo un abbozzo per darti un idea, non l’ho neanche testato, ma in linea di massima dovrebbe essere abbastanza corretto. Fammi sapere se hai bisogno di ulteriori chiarimenti ;)
    A presto e grazie di essere passato su problog.

    PS: una curiosità… ma sei italiano?

  7. Ciao loige si come di php sono a zero :( quello che voglio fare io e questo . una form mail uguale come quella di questo sito http://www.tmpedanesrl.com/it/contatti.htm e una volta compliato il form va inviata alla mia email

  8. Ti rispondo molto velocemente perchè vado di fretta, ma se hai qualche difficoltà ne riparliamo con calma.
    Allora ti spiego un po’ come funzionano i form web.
    Creando un form web crei un modulo che ti permette di raccogliere un certo numero di dati inseriti dall’utente (tramite campi di tensto, checkbox, optionbox e quant’altro). Quando l’utente riempie il modulo e preme il pulsante “invia” questi dati vengono inoltrati ad una specifica pagina in cui TU dovrai scrivere del codice adato per gestire questi dati (ovvero decidere se memorizzarli in un database, mostrarli a video o inviarli via mail).
    DI conseguenza in linea di principio avrai ben capito che dovrai progettare sia l’interfaccia di raccolta dei dati (il form) e questo puoi farlo in puro html e sia il meccanismo di gestione dei dati (questo va invece fatto con un linguaggio di scripting server side, e va benissimo php).
    L’esempio che ti ho scritto sopra realizzava la parte in php e puoi inserirlo in un file php indipendente (supponiamo per semplicità che il file si chiami “form.php”).
    per realizzare invece il modulo web dovrai scrivere in una pagina html qualcosa del genere: (nota che ho ripreso esattamente il codice dalla pagina web che hai citato tu stesso)

     
    <form method=“post” action=“form.php” target=“_blank”>
                    <div align=“center”>
                      <center>
                      <table border=“0″ cellpadding=“3″ cellspacing=“0″ style=“border-collapse: collapse” bordercolor=“#111111″ id=“AutoNumber2″>
     
                        <tr>
                          <td><font face=“Verdana” size=“2″>Nome</font></td>
                          <td><input type=“text” name=“name” size=“30″></td>
                        </tr>
                        <tr>
                          <td><font face=“Verdana” size=“2″>Cognome</font></td>
                          <td><input type=“text” name=“surname” size=“30″></td>
                        </tr>
     
                        <tr>
                          <td><font face=“Verdana” size=“2″>Azienda</font></td>
                          <td><input type=“text” name=“company” size=“30″></td>
                        </tr>
                        <tr>
                          <td><font face=“Verdana” size=“2″>Telefono</font></td>
                          <td><input type=“text” name=“telephone” size=“30″></td>
                        </tr>
     
                        <tr>
                          <td><font face=“Verdana” size=“2″>Fax</font></td>
                          <td><input type=“text” name=“fax” size=“30″></td>
                        </tr>
                        <tr>
                          <td><font face=“Verdana” size=“2″>Email</font></td>
                          <td><input type=“text” name=“email” size=“30″></td>
                        </tr>
     
                      </table>
                      </center>
                    </div>
                    <p align=“center”><font face=“Verdana” size=“2″>Messaggio<br>
                    </font><textarea rows=“9″ name=“comments” cols=“34″></textarea></p>
                    <p align=“center”><input type=“submit” value=“INVIA” name=“B1″></p>
                  </form>


    Adesso tocca a te fare qualche prova pratica.
    Fammi sapere se incontri problemi ed eventualmente dammi una spiegazione dettagliata del problema riscontrato e cercherò di fare del mio meglio per aiutarti ;)
    A presto
    ciao!

  9. ciao loige scusa per non averti risposto lo visto ora .-> PS: una curiosità… ma sei italiano?
    Sono Meta e meta ti spiego
    Madre IT e Padre FR e anche la mia vita e divisa in metta e metta cioè , fino a 10 anni ho vissuto in FR , e da 10 anni che vivo in Italia
    ci sono molti errori di grammatica ed e questo il motivo 

    infatti il codice html lo preso li :) .
    il file non funziona dopo che invio mi da un errore oltre che nel mia e-mail non arriva niente . questo errore me lo da anche con un altro code php
    ti elenco tutti i due link su un spazio di altervista prestato (non pensa che, il spazio e prestato e per questo non funziona :) :) :) :) ) cosi li provi tu

    vedi se in qualche code php o html sbaglio

    il code che mi hai fatto tu -> http://albhack.altervista.org/contatti_1.html
    un altro code -> http://albhack.altervista.org/contatti.html

  10. ciao logie mi da un errore :( ho caricato i file su un spazio di altervista dai una ochiata tu
    questo e il fail che mi hai datto tu ->http://albhack.altervista.org/contatti_1.html
    questo e un altro -> http://albhack.altervista.org/contatti.html

  11. ho dato un’occhiata veloce…
    prova a modificare le ultime due righe del php così:

     
    if ($m->send())
    echo(“Il messaggio di posta e’ stato inviato correttamente”);


    cioè mettendo le parentesi vuote dopo il send… questo poichè send è un metodo e non un attributo…
    cmq mi sono accorto che l’errore l’avevo fatto io all’inizio nell’esempio che ti ho fatto… scusami sarà stata la fretta :P

  12. ciao logie mi da ancora un atro errore
    errore -> Parse error: syntax error, unexpected ‘@’ in /membri/albhack/sendMail.php on line 4
    provalo tu cosi vedi l’erorre -> http://albhack.altervista.org/contatti_1.html

  13. cambia la 4 riga cosi’:

     
    $m = new sendMail();

    ovvero togli l’argomento del costruttore dell’oggetto di classe sendMail. Questo in quanto sendMail non ha parametri di costruzione. E tantomeno se volevi inserire una stringa come parametro dovevi racchiuderla tra apici o doppi apici ;)

    Fammi sapere se abbiamo risolto il problema ;)

  14. cieo questa riga
    $m->setSubject( “Messaggio inviato dal mio sito da {$_POST[’Nome’]} {$_POST[’Cognome’]}” );
    lo provato con 2 diversi contatti
    1-hotmail.it
    2-gmail.com
    puo esere che non vano bene questi ?

  15. Ma che problema ti da adesso?!

  16. stesso errore cambia solo il n° 4/ avolte 6/8/2 in base ogni modifica che faciamo da un errore :(
    Parse error: syntax error, unexpected ‘@’ in /membri/albhack/sendMail.php on line 4

  17. Fammi vedere il tuo ultimo codice ;)
    mandamelo per e-mail oppure dimmi in quale pagina lo inserisci (come avevi fatto prima)

    ;)

Scrivi un commento