Tra i tanti strumenti messi a disposizione dal framework CodeIgniter (leggi l'articolo di introduzione a CodeIgniter) non mancano naturalmente quelli dedicati appositamente all'invio di posta elettronica tramite pagine Web; la classe Email e stata integrata dagli sviluppatori per questo scopo e fornisce all'utilizzatore numerose funzionalità che permettono di svolgere operazioni anche complesse tra cui:
- possibilità di inviare e-mail sia in formato semplice testo che in HTML;
- supporto per i protocolli più diffusi come per esempio Mail, Sendmail e SMTP;
- possibilità di definire più destinatari per un unico messaggio (utile nella realizzazione di newsletter e nella gestione di mailing list );
- supporto per l'invio di allegati;
- strumenti per le operazioni debugging;
- features per definizione delle priorità;
- supporto per CC (Carbon Copy, copia per conoscenza) e BCC (Blind Carbon Copy, copia nascosta per conoscenza);
- definizione di BCC batch per l'invio di grandi quantità di email;
- supporto per il Word wrap (o line wrap) nella gestione degli spazi tra le parole.
Nel corso di questa breve trattazione affronteremo i vari aspetti relativi all'invio di posta elettronica tramite la classe Email di CodeIgniter fornendo esempi pratici esplicativi delle diverse procedure
Inviare email con CodeIgniter
Sfruttare le potenzialità della classe Email per spedire messaggi di posta elettronica tramite una pagina Web è molto semplice, inoltre, i metodi e le funzioni relativi alla classe consentono alti livelli di configurazione e personalizzazione.
Un semplice esempio di codice per l'invio di email con CodeIgniter potrebbe essere il seguente:
# scarichiamo la libreria per l'invio delle email $this->load->library('email'); # definiamo indirizzo e nome del mittente $this->email->from('claudio@miamail.com', 'Claudio'); # indichiamo l'indirizzo del destinatario $this->email->to('francesco@suamail.com'); # per conoscenza inviamo la mail anche all'indirizzo.. $this->email->cc('cristina@suamail.com'); # definiamo il destinatario in copia a nascosta $this->email->bcc('gruppo@loromail.com'); # oggetto del messaggio $this->email->subject('Email con CodeIgniter'); # messaggio dell'email $this->email->message('Inviare una email con il framework PHP CodeIgniter.'); # invio del messaggio $this->email->send(); # debugging echo $this->email->print_debugger();
Per ogni componente dell'email CodeIgniter, o meglio la sua classe Email, dedica un determinata funzione. Nel prossimo paragrafo vedremo a cosa servono queste funzioni e come vanno utilizzate.
Invio di email: mittenti e destinatari
Quando si desidera inviare una email con CodeIgniter la prima componente da definire è quella relativa al mittente, per far questo abbiamo a disposizione la funzione $this->email->from()
che accetta come parametri l'indirizzo di posta elettronica di chi invia il messaggio e il suo nome:
$this->email->from('claudio@miamail.com', 'Claudio');
È possibile indicare nel corpo dell'email anche un indirizzo per la risposta, nel caso in cui la funzione precedentemente descritta non lo contenga la classe mette a disposizione una funzione apposita, denominata $this->email->reply_to()
a cui possono essere associati come argomenti l'indirizzo per il reply e il relativo nome del destinatario:
$this->email->reply_to('claudio@miamail.com', 'Claudio');
Una volta definite le componenti relative al mittente è possibile passare a quelle che riguardano il destinatario, in questo caso ci viene in aiuto la funzione $this->email->to()
che accetta come parametro l'indirizzo email di chi dovrà ricevere il messaggio.
È possibile indicare un singolo indirizzo di posta elettronica:
$this->email->to('francesco@suamail.com');
Oppure si potranno specificare alla funzione tutti gli indirizzi da contattare separandoli con una virgola:
$this->email->to('francesco@suamail.com', 'laura@suamail.com', 'monica@suamail.com');
Infine, sarà possibile definire un array contenente la lista degli indirizzi dei destinatari e passarlo come parametro alla funzione:
$destinatari = array('francesco@suamail.com', 'laura@suamail.com', 'monica@suamail.com'); $this->email->to($destinatari);
Le funzioni $this->email->cc()
per l'invio di copie per conoscenza (CC) e $this->email->bcc()
per l'invio di copie nascoste per conoscenza (BCC), funzionano in modo molto simile alla funzione per la definizione del destinatario; quindi sarà possibile passare ad esse come argomenti un singolo indirizzo di posta elettronica così come una lista di indirizzi separati da una virgola o un array di valori.
Invio di email: messaggi e allegati
Lo scopo della funzione $this->email->subject()
è facilmente comprensibile, essa accetta come parametro stringhe di testo destinate a contenere l'oggetto del messaggio che si desidera inviare:
$this->email->subject('Email con CodeIgniter');
La funzione da utilizzare per definire il testo del messaggio (message body) funziona nello stesso modo anche se lo scopo per cui è stata concepita è differente:
$this->email->message('Inviare una email con il framework PHP CodeIgniter.');
In associazione alla funzione $this->email->message()
è possibile utilizzare un'altra funzione denominata $this->email->set_alt_message()
che definisce un messaggio alternativo a quello precedentemente definito dall'utente:
$this->email->set_alt_message('Questo è un messaggio alternativo');
$this->email->set_alt_message()
è una funzione opzionale che per esempio può essere utilizzata nel caso di invio di massaggi in formato HTML: se il messaggio predefinito è in formato HTML e il client di posta o il Webmail utilizzati dal destinatario non consentono la lettura di questo tipo di email, sarà possibile mostrarne comunque il contenuto grazie ad un testo in formato alternativo.
Un'altra funzione particolarmente interessante da analizzare è $this->email->clear()
, quest'ultima ha il compito di inizializzare le variabili passate come argomento all'interno del codice per l'invio dell'email; questa funzione viene utilizzata quando si intende inviare delle email attraverso un ciclo, infatti la sua introduzione permette di resettare i dati ad ogni iterazione del ciclo stesso:
foreach ($destinatari as $nome => $destinatario) { $this->email->clear(); $this->email->to($destinatario); $this->email->from('claudio@miamail.com'); $this->email->subject('Una mail per te: '.$nome); $this->email->message('Ciao '.$nome.' Ti scrivo perchè...'); $this->email->send(); }
$this->email->clear()
accetta come argomento il parametro TRUE, se questo viene indicato oltre al reset dei dati avremo anche quello degli allegati.
Per inviare degli allegati insieme ai nostri messaggi di posta elettronica, la classe Email mette a disposizione la funzione $this->email->attach()
, essa accetta come argomento il percorso relativo ai file che si desidera inviare, non è invece possibile indicare come path un percorso assoluto. A differenza delle funzioni per la definizione dei destinatari $this->email->attach()
non permette il passaggio come argomento di un array con più valori, sarà quindi necessario invocarla tante volte quanti sono gli allegati da spedire; quindi un esempio di invio di email con più allegati potrebbe essere il seguente:
$this->email->attach('/vacanze/spiaggia.jpg'); $this->email->attach('/lavoro/ufficio.jpg'); $this->email->attach('/famiglia/mamma.jpg'); $this->email->send();
Invio di email: invio e debugging
Come è facile intuire, la funzione $this->email->send()
presiede all'invio del messaggio di posta elettronica; questa funzione è in grado di restituire un valore booleano TRUE
(1 o vero) o FALSE
(0 o falso), per questo motivo può essere utilizzata facilmente all'interno di costrutti condizionali per la notifica degli esiti di invio:
if ( ! $this->email->send()) { // notifica di errore nell'invio } else { // notifica di invio corretto }
Dopo la funzione per l'invio della email è eventualmente possibile utilizzare $this->email->print_debugger()
, un costrutto che ha il compito di restituire una stringa contenente tutti i messaggi inviati da Web server in seguito all'esecuzione dello script nonché le intestazioni (headers) dell'email e il messaggio in essa contenuto.
Si tratta di una funzione particolarmente utile per effettuare il debugging delle applicazioni, da utilizzare per esempio nel caso in cui si desideri scoprire se nella configurazione del proprio spazio Web sono previste delle limitazioni nell'uso di determinate funzioni, si pensi per esempio alla funzione popen in alcuni casi poco gradita ai provider di hosting.
Utilizzando $this->email->print_debugger()
in un ambiente in cui PHP Sendmail non è disponibile, sarà per esempio possibile ricevere dal server un messaggio simile al seguente:
Unable to open a socket to Sendmail. Please check settings. Unable to send email using PHP Sendmail. Your server might not be configured to send mail using this method.
Conclusioni
In questa breve trattazione abbiamo descritto gli strumenti messi a disposizione dal framework PHP CodeIgniter per la gestione dell'invio di messaggi di posta elettronica attraverso pagine Web; per questo motivo, abbiamo posto la nostra attenzione sulla classe denominata Email che l'applicazione dedica appositamente allo scopo di spedire email e sulle funzioni che questa classe fornisce per le varie procedure relative alla definizione di mittenti e destinatari, scrittura dei messaggi, invio e debugging.
Per maggiori informazioni è possibile consultare l'ottima sezione dedicata alla classe Email contenuta nello user Wiki di CodeIgniter.