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).

<?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!');
		}
	}
}

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í

<form action="#" method="post" enctype="multipart/form-data">
<input type="file" name="data[Usuario][name1]" />
<input type="submit" value="Procesar contactos">
</form>

Una respuesta a “Parsear e importar contactos o direcciones de email desde .csv”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *