Parsear e importar contactos o direcciones de email desde .csv

Necesitaba hacer una función para parsear y procesar un .csv pues quería hacer una aplicación que subiendo un .csv exportado de la libreta de direcciones de Outlook o Thunderbird, un usuario pudiera invitar a todos sus contactos de su agenda.
Una de las claves de esta función es la función de php fgetcsv(), que es similar a fgets() excepto que fgetcsv() examina la línea que lee para tratar campos en formato CSV y devuelve una matriz que contiene el campo leído.

A continuación la función para parsear y procesar archivos .csv exportados desde Outlook o Thunderbird.
Nota: la función tan sólo procesa y obtiene todos las direcciones de correo válidas en un array, a partir de aquí que cada uno siga como quiera. Lo normal es presentar al usuario todos los correos obtenidos en un formulario y que pueda elegir a que contactos le llega la invitación, seleccionando o deselecionando sendos checkbox. Esto ya se puede hacer todo lo bonito que se quiera con diseño y jquery (o las librerías de javascript que uno elija).

[code lang=”PHP”]
<?php
/**
* Funcion que se encarga de procesar el contenido de un archivo .csv
* Los archivos .csv o comma-separated values, suelen servir para exportar la libreta de direcciones de gestores de correo como Outlook o Thunderbird
* En la siguiente funcion, se procesa el contenido de un .csv para recoger todos los emails que contenga.
* Se realiza previamente una serie de comprobacaciones de <a title="seguridad" href="http://www.pedroventura.com/tag/seguridad/">seguridad</a>.
* Así como el filtrado con una expresion regular para tan sólo obtener las direcciones de email, pues un csv contiene tantos datos como tengamos en nuestra libreta de direcciones
* El resto de la lógica queda abierta a las necesidades de cada uno.
* Nota: este ejemplo esta realizado sobre el framework <a title="CakePHP" href="http://www.pedroventura.com/cakephp/">CakePHP</a>
* @author Pedro Ventura www.pedroventura.com
* @version 1.0
*
*/

function procesar_contactos_csv() {
$formatosFicheroValidos = array(‘text/csv’);
if (!empty($this->data)) {
if (isset($this->data[‘Usuario’][‘name1’][‘name’]) && (!empty($this->data[‘Usuario’][‘name1’][‘name’]))) {
$arrayEmails = array();
if (in_array($this->data[‘Usuario’][‘name1’][‘type’],$formatosFicheroValidos)) {
$punteroFichero = fopen($this->data[‘Usuario’][‘name1’][‘tmp_name’], "r");
if ($punteroFichero) {
while (($aDatos = fgetcsv($punteroFichero, 1000, ",")) !== false) {
foreach ($aDatos as $registro) {
# solo tomo los emails, pues $registro puede tener el nombre, apellidos, etc..
if (preg_match(‘/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/’,$registro)) {
# verifico que no este ya en el array de emails finales, para no repetirlo
if (!in_array($registro,$arrayEmails)) {
$arrayEmails[] = $registro;
}
}
}
}
fclose($punteroFichero);
}
} else {
$this->Session->setFlash(‘Formato de archivo incorrecto, tienes que subir un archivo .csv’);
}
# seteamos el array obtenido para seguir procesando o realizar la logica que cada uno desee
$this->set(‘aEmailsContactos’,$arrayEmails);
} else {
$this->Session->setFlash(‘Primero debes seleccionar un archivo .csv para poder procesarlo!’);
}
}
}

Otro artículo de Interés:  sql actualizar todos los passwords de una tabla a md5

[/code]

No me voy a parar a explicar mucho el HTML para generar el formulario de subida, esta parte es relativamente sencilla, pero vendría a ser algo así
[code lang=”HTML”]
<form action="#" method="post" enctype="multipart/form-data">
<input type="file" name="data[Usuario][name1]" />
<input type="submit" value="Procesar contactos">
</form>
[/code]

1 comentario en «Parsear e importar contactos o direcciones de email desde .csv»

Deja un comentario

Enable Notifications    Ok No thanks