Server IMAP - Rubrica contatti: come generarla dalla posta in arrivo
La rubrica contatti, specialmente per alcune categorie professionali, riveste un'importanza cruciale nel lavoro.
Come per tutte le informazioni su database, Netlogica provvede ad effettuare backup verificati per un eventuale recupero su richiesta del cliente ma in alcuni casi, spesso a valle di un trasferimento dominio con annesso servizio di posta elettronica, dove già prevediamo di trasferire sul nuovo mailserver tutti i messaggi di posta in giacenza sul precedente mailserver, può essere utile riprodurre sul webmail anche la rubrica.
Nell'esempio che segue eseguiremo uno script da terminale - è stato utilizzato PHP per consentire una semplice esecuzione anche tramite webserver oltre che da terminale - che si connetta alla mailbox, legga le intestazioni IMAP per ogni singolo messaggio ed estrapoli nome del mittente e relativo indirizzo di posta elettronica.
Tutti i dati estrapolati saranno salvati dallo script in un file in formato CSV (Comma Separated Value) per consentirne l'importazione su webmail (Roundcube, Horde, Gmail, ecc.) oltre che su client di posta elettronica stand-alone (Mozilla Thunderbird, Windows Live Mail, ecc.).
Nel caso specifico di mailbox sui nostri server, lo script anziché salvare i dati in un file CSV avrebbe eseguito query SQL INSERT sulla tabella contenente la rubrica del database ad uso del webmail.
Il codice dello script è il seguente:
retrieveHeaders.php
$s = microtime(true);
$contacts = array();
$username = Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.';
$password = 'xyzxyzxyzxyzxyz';
$imapserver = 'noway.net';
$imap = imap_open('{'.$imapserver.':143/novalidate-cert}INBOX', $username, $password);
$n_msgs = imap_num_msg($imap);
echo '-> RETRIEVE AND SHOW ALL CONTACTS - FOUND '.$n_msgs.' messages'."\n";
for ($i=0; $i<$n_msgs; $i++) {
$header = imap_header($imap, $i);
array_push($contacts, $header->fromaddress);
echo $header->fromaddress."\n";
}
imap_close($imap);
echo "\n";
echo "-> REMOVE DUPLICATE AND MAKE FILE TO IMPORT\n\n";
$contactsUnique = array_unique($contacts,SORT_STRING);
// make new array with name, email
$contactsNameAddress = array();
array_push($contactsNameAddress, '"Display Name","E-mail Address"');
foreach($contactsUnique as $element) {
echo 'processing '.$element."\n";
list($name, $address) = catcherEmailInfo($element);
if ($name !='' && $address != '') {
array_push($contactsNameAddress, '"'.$name.'","'.$address.'"');
}
}
// store name, address into file
file_put_contents('array.csv', implode("\n", $contactsNameAddress));
$e = microtime(true);
echo "\n";
echo 'Complete in '.($e - $s);
exit;
function catcherEmailInfo($emailAddress) {
$senderName = '';
$senderAddress = '';
$emailInfo = explode('<',$emailAddress);
if (count($emailInfo) > 1) {
$senderName = rtrim($emailInfo[0]);
$senderAddress = substr($emailInfo[1], 0, -1);
} else {
$senderName = $emailAddress;
$senderAddress = $emailAddress;
};
return array(rtrim($senderName), $senderAddress);
}
Nell'immagine seguente viene mostrato il terminale di una distribuzione BackBox Linux dove viene lanciato lo script retrieveHeaders.php
Una volta lanciato lo script, questo effettua la connessione al server IMAP, legge il numero di messaggi contenuti nella cartella della posta in arrivo ed itera leggendo le intestazioni di ogni singolo messaggio (non quindi il messaggio completo che sarebbe inutile e renderebbe il processo particolarmente lento). A video viene mostrato l'indirizzo email del mittente del messaggio che viene processato.
Una volta completato il processo (per circa 6000 messaggi occorrono un paio di minuti, il tempo è comunque dipendente da vari fattori, non ultimo la velocità della connessione), lo script restituisce il file CSV contenente la lista di tutti gli indirizzi ed i nominativi dei mittenti.
Da notare che gli indirizzi duplicati vengono tutti rimossi dal vettore prima che il file CSV sia scritto.
Nel nostro esempio il file contiene alcune intestazioni per una corretta importazione in Roundcube su cui è basato Netmail di Netlogica.
Una volta effettuato l'accesso, si dovrà aprire la sezione contatti per l'importazione del file CSV.
Cliccando sul pulsante "Importa" si accede alla vera e propria schermata di selezione del file da importare.
Si selezionerà quindi il file array.csv contenuto nella directory di retrieveHeaders.php.
Una volta selezionato il file, il processo di importazione viene invocato cliccando sul pulsante "Importa".
Una volta importata la nuova rubrica contatti, scrivendo un nuovo messaggio sarà operativo l'autocompletamento indirizzi, per cui scrivendo le prime lettere del nome o dell'indirizzo del nostro destinatario, Netmail ci proporrà la finestra di selezione del contatto.
Lo script retrieveHeaders.php fa uso della classe IMAP. Qualora la classe non sia installata sul computer o sul server, occorrerà preventivamente installarla.
Per l'installazione occorrerà: installare il pacchetto - e relative dipendenze - da terminale; abilitare il modulo.
Per PHP versione 5:
$ sudo apt-get install php5-imap $ sudo php5enmod imap
Per PHP versione 7:
$ sudo apt-get install php7.0-imap $ sudo phpenmod imap
Nel caso di macchine Windows, sarà sufficiente rimuovere il commento (il carattere ";") nel file php.ini.
extension=php_imap.dll
Qualora l'esecuzione avvenga su un server dove si sia resa necessaria l'installazione del pacchetto/modulo IMAP di PHP, occorrerà riavviare il daemon webserver. Nel caso di webserver Apache su server Linux, lanciare il comando seguente da terminale:
$ sudo /etc/init.d/apache2 restart.