Gmail è un servizio per la gestione della posta elettronica di proprietà di Google che mette a disposizione tutte le funzionalità essenziali per un Webmail tramite un'interfaccia basata su Ajax; creato nel 2004 ma uscito dalla fase beta soltanto nel 2009, è oggi una delle piattaforme più diffuse in Rete per la comunicazione tramite e-mail, per il suo utilizzo basta possedere un Google account.
Gmail supporta sia il protocollo POP3 che l'IMAP, nel corso di questa trattazione verranno mostrate le procedure necessarie per realizzare un'applicazione PHP che utilizzi le funzioni per IMAP per comunicare con questo servizio.
Abilitare la funzionalità IMAP in Gmail
Prima di passare al codice, è opportuno fare alcuni riferimenti agli strumenti che verranno utilizzati, con il termine IMAP (acronimo di Internet Message Access Protocol) viene indicato un protocollo di comunicazione per la ricezione di posta elettronica nato nel 1986 come alternativa all'ancora oggi diffusissimo POP3 (Post Office Protocol).
IMAP, per rendere le cose semplici, consente la comunicazione di tipo bidirezionale tra un server di posta, come Gmail, e i client. Quando si accede a Gmail tramite Web browser tutte le attività eseguite si riflettono nello stesso tempo anche sul servizio (sincronizzazione bidirezionale tra i client di posta e Webmail).
IMAP, giunto ad oggi alla versione 4, offre un miglior supporto per l'accesso alla posta elettronica attraverso i dispositivi mobili come per esempio gli smartphone, inoltre, si rivela complessivamente più stabile di POP3 limitando il verificarsi di malfunzionamenti che potrebbero portare alla perdita di messaggi e o al download ripetuto di copie degli stessi messaggi.
Prima di interagire con Gmail tramite IMAP, è necessario verificare che il supporto per questo protocollo sia stato abilitato per il proprio account, per cui sarà necessario eseguire il login su Gmail stesso e poi:
- fare clic sull'icona a forma di ingranaggio in alto a destra della barra di configurazione;
- selezionare la voce Impostazioni Gmail;
- fare clic sul collegamento Inoltro e POP/IMAP;
- recarsi nella sezione Accesso IMAP e spuntare la voce Attiva IMAP.
A questo punto basterà fare clic sul pulsante Salva modifiche per confermare le impostazioni desiderate.
Connessione a Gmail con PHP e IMAP
Per poter utilizzare le funzioni IMAP di PHP bisognerà verificare innanzitutto che nella cartella delle estensioni per il linguaggio sia presente la necessaria libreria, denominata php_imap.dll. Verificato questo si dovrà editare il file di configurazione di PHP (php.ini) e procedere con la fase di abilitazione aggiungendo nella sezione dedicata alle estensioni la riga:
extension=php_imap.dll
Se presente ma non abilitata, la direttiva dovrà essere decommentata eliminando il ;
(punto e virgola) posto accanto ad essa.
Passiamo al codice vero e proprio. Per procedere con la fase di connessione bisognerà definire le variabili relative alle informazioni necessarie per l'autenticazione al servizio
// server IMAP per la connessione
$server = '{imap.gmail.com:993/ssl/novalidate-cert}';
// account Gmail
$login = 'mioaccount@gmail.com';
// password per l'accesso a Gmail
$password = 'miapassword';
Come è possibile notare da quanto proposto, il nome del server IMAP di Gmail è imap.gmail.com, la porta utilizzata dovrà essere in questo caso la numero 993, si tenga infatti conto del fatto che, anche se la porta predefinita per questo protocollo è la 143, Gmail utilizza connessioni sicure tramite SSL che avvengono, appunto, sulla porta 993. I parametri aggiuntivi per la connessione saranno la username e la password comunemente utilizzati per l'accesso al servizio.
Una volta definite le variabili necessarie, si potrà passare alla fase relativa all'apertura della connessione:
// connessione IMAP ad un account Gmail
$connessione = imap_open($server, $login, $password);
imap_open()
è una funzione che ha il compito di aprire uno stream (flusso di comunicazione) IMAP verso una casella di posta elettronica.
Se il tentativo di connessione non dovesse dare luogo ad errori, si potranno effettuare le prime operazioni di interazione con Gmail.
Accedere ai messaggi
Una volta aperta una connessione con il servizio di posta tramite IMAP sarà subito possibile eseguire alcune operazioni elementari, come per esempio il conteggio dei messaggi presenti nella mailbox del proprio account; per questo scopo è disponibile un'apposita funzione di PHP denominata imap_num_msg()
che necessita come unico argomento la connessione appena aperta:
// conteggio dei messaggi presenti
$conteggio = imap_num_msg($connessione);
Si otterrà così una variabile ($conteggio
) a cui sarà associata l'informazione relativa al totale del messaggi presenti; questo valore potrà essere utilizzato per vari scopi, quello più interessante è relativo alla visualizzazione di tutti i messaggi presenti nella mailbox che potrà essere ottenuta attraverso un semplice ciclo di iterazione:
// estrazione e visualizzazione dei messaggi
for($i = 1; $i <= $conteggio; $i++) {
$intestazioni = imap_headerinfo($connessione, $i);
echo $corpo = imap_body($connessione, $i);
}
La funzione imap_headerinfo()
ha il compito di leggere le intestazioni (headers) di un messaggio di posta elettronica che viene identificato tramite il suo numero d'ordine, esso crea un oggetto contenente informazioni relative al messaggio stesso tra cui il mittente, il destinatario, lo "stato" (seen o unseen, cioè già aperto o no), eventuali copie carbone e molto altro; per cui avremo per esempio la possibilità di visualizzare la data di ogni messaggio elencato dal codice precedente inserendo all'interno del ciclo for
, dopo la riga:
$intestazioni = imap_headerinfo($connessione, $i);
l'istruzione:
// visualizzazione della data contenuta nell'intestazione
echo $intestazioni->date;
imap_body()
è invece una funzione che accetta come argomenti la connessione IMAP e il numero d'ordine di un messaggio, essa restituisce l'intero corpo di un messaggio e non soltanto il suo testo, per cui singole parti potranno essere estratte sulla base della struttura del messaggio stesso.
Visualizzazione dei messaggi
Il numero d'ordine di un messaggio potrà essere utilizzato anche per la visualizzazione di un singolo messaggio:
// estrazione e visualizzazione di un singolo messaggio
$intestazioni = imap_headerinfo($connessione, 3);
echo $intestazioni->date;
echo $corpo = imap_body($connessione, 3);
Nel caso specifico dell'esempio appena proposto, verranno visualizzati la data e il corpo del terzo messaggio più datato tra quelli memorizzati da un account Gmail.
Le informazioni disponibili tramite la funzione imap_headerinfo()
, potranno essere utilizzate per vari scopi, nell'esempio seguente verrà proposto un semplice metodo per effettuare unicamente l'estrazione dei messaggi non letti:
$conteggio = imap_num_msg($connessione);
for($i = 1; $i <= $conteggio; $i++) {
$intestazioni = imap_headerinfo($connessione, $i);
if($intestazioni->Unseen == 'U') {
echo $corpo = imap_body($connessione, $i);
}
}
La proprietà unseen può infatti assumere due valori di ritorno, U
se il messaggio non è stato aperto o "" (nessun valore) in caso contrario.
Visualizzazione delle cartelle
imap_list()
è il nome di una funzione PHP che permette di leggere la lista delle mailbox di un determinato account con cui è stata stabilita una connessione, essa potrà essere utilizzata nel modo seguente:
$mailbox = imap_list($connessione, $server, '*');
A questo punto sarà disponibile un array contenente tutti i nomi delle cartelle associate ad un account, basterà quindi un semplice ciclo foreach
per stampare a video il contenuto del vettore:
// visualizzare la lista delle mailbox
foreach ($mailbox as $val) {
echo $val . "<br>n";
}
Si noterà che ogni nome in elenco verrà preceduto dall'informazione relativa al server IMAP, ad esempio: {imap.gmail.com:993/ssl/novalidate-cert}[Gmail]/Posta inviata
Per la pulizia dell'elenco da questa informazione basterà una semplice istruzione per il "cerca e sostituisci" basata sulla funzione str_replace()
:
foreach($mailbox as $nome) {
$nome_abbreviato = str_replace($server, '', $nome);
echo $nome_abbreviato . "<br>n";;
}
che permetterà di ottenere una lista sul modello della seguente:
Conferme di recapito INBOX Lavoro Personale Viaggio [Gmail]/Bozze [Gmail]/Cestino [Gmail]/Posta inviata [Gmail]/Spam [Gmail]/Speciali [Gmail]/Tutti i messaggi
Ottenuti i nomi delle cartelle, questi potranno essere utilizzati per operazioni di accesso diretto ad esse utilizzando la funzione imap_reopen()
che ha appunto il compito di "riaprire" lo stream verso una specifica mailbox:
imap_reopen($connessione, $server . '[Gmail]/Spam');
imap_reopen()
accetta come argomenti lo stream aperto tramite imap_open()
, l'informazione relativa al server IMAP da contattare e il nome della cartella con il cui contenuto si desidera interagire.
Cancellazione dei messaggi
Per l'eliminazione dei messaggi è disponibile la funzione imap_delete()
che accetta come argomenti la connessione al server IMAP e il numero d'ordine del messaggio da cancellare:
// cancellazione di un messaggio
imap_delete($connessione, '3');
Sarà inoltre possibile spostare un messaggio nel "cestino dei rifiuti" tramite l'apposita funzione imap_mail_move()
, come nell'esempio seguente:
// spostamento di un messaggio nel cestino
imap_mail_move($connessione, '16', '[Gmail]/Cestino');
La stessa funzione potrà essere utilizzata anche per effettuare lo spostamento di messaggi verso cartelle diverse dal cestino.
Chiusura della connessione
Una volta terminate le operazioni a carico della posta elettronica gestita tramite Gmail, sarà possibile chiudere la connessione al server IMAP tramite la funzione imap_close()
:
// chiusura della connessione
imap_close($connessione);
Conclusione
Nel corso di questa trattazione sono state descritte le procedure necessarie per interagire con Gmail tramite un'applicazione PHP basata sulle funzioni IMAP ed eseguire operazioni di connessione, visualizzazione dei messaggi e delle cartelle e cancellazione delle email.