2011-11-27 14 views
8

tengo un sitio web que permiten a las personas a darse de baja a otros sitios web (a la lista de correo, o spam, etc ...)php archivo de leer para la importación de MySQL

mi aplicación web permite a los clientes y usuarios cargar lista de correo electrónico cifrado para Desuscripción masiva.

tengo una mesa: unsubs. esa tabla tiene correo electrónico y dominio.

la estructura de archivos es la siguiente:

 
jhq232q3hq2yq3yuh2qyuqU/A$Ja324ju3a4jah34u3w$UQ"$Uq4u 
q34/hRYHSEa34uw34uQ"/YQ/$84?%JHHdfhdFJKAjaRJSErjsrjse 
W%$?p09-*Y+_)y8p7uYJgADGq2/TYQgSj1qR"3tQ"/gEHseruDUId 

aquí es mi PHP:

function decrypt($line) { 
// do my logic etc... 
return $line; 
} 
function isEmail($email) { 
if(preg_match("/^([a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9_-]+)+$/", $email)){ 
return true; 
} 
return false; 
} 

function checkEmail($email) { 
// logic 
return array('baddomain.com'); 
} 

function emailExists($email) { 
// my logic 
return TRUE; // for example 
} 

$file = file_get_contents('sample.txt'); 

$lines= explode("\n", $file); 
foreach($lines as $line) { 
if(!empty($line)) { 
$line = decrypt($line); 
if(isEmail($line)) { 
$services = checkEmail($line); 
if(is_array($service)) { 
    foreach($services as $service) { 
    insertEmail($db, $service, $line); // this is used 
    } 
} 
} 
} 
} 

la comprobación de la función de comprobación de correo electrónico si el correo electrónico es sospechoso en todas las listas, devuelve falso si todo está unsubscripbed y una matriz (lista de servicios = dominio) si ninguno.

ahora mi problema es que cada vez que quiero comprobar si un correo electrónico es válido devuelve falso. mi encriptación funciona bien y es a prueba de balas.

¿Qué es lo que me falta?

Respuesta

13

Primero, su script importa el archivo usando \n pero si alguien carga el archivo con el carácter de Windows como \r\n, su script no funcionará.

En segundo lugar, su correo electrónico regexp no funciona correctamente. Recomiendo usar filter_var.

Lo que recomendaría para su mesa es crear tablas diarias. De esta forma, cuando consulte su tabla, será más rápido de ejecutar. Si solo tiene una tabla con varchar como índices, puede ser lenta después de algunas veces (suponiendo que las personas quieran optar por no recibir el sitio incorrecto [que creo que tienen]), pero así soy yo.

CREATE TABLE `unsub_20111127` (
    `email` varchar(255) NOT NULL, 
    `domain` varchar(255) NOT NULL, 
    `is_unsubscribed` tinyint(3) NOT NULL DEFAULT 0, 
    PRIMARY KEY (`email`, `domain`), 
    KEY is_unsubscribed (`is_unsubscribed`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

De esta manera es más fácil procesar pequeñas cantidades de datos cada vez. He añadido un estado en caso de tener que repetir el proceso de nuevo por lo que sólo procesa los datos con el is_unsubscribed = 0 (no procesado)

(si es necesario crear una tabla que lee todas las tablas que puede crear un merge table);

PHP:

function insertEmail($db, $service, array $data) { 
    // logic for insert 
    $sql = 'INSERT IGNORE INTO table_YYYYMMDD VALUES ' . implode(',', $data); 
} 

function createTable($date) { 
    // logic for insert 
    $sql = 'CREATE TABLE IF NOT EXISTS table_' . $date . ' /* etc...*/'; 
} 

// start 

// create the table for the next day if not exists 
createTable(date('Ymd', strtotime('tomorrow'))); 

$file = file('sample.txt', FILE_IGNORE_NEW_LINES^FILE_SKIP_EMPTY_LINES); 

$emailList = array(); 

foreach($file as $line) { 
$line = decrypt($line); 
if(!filter_var($line, FILTER_VALIDATE_EMAIL)) { 
    $services = checkEmail($line); 
    if(is_array($services)) { 
    foreach($services as $service) { 
    $emailList[] = "('" . $line . "', '" . $service . "', 1)"; 
    } 
    if(!empty($emailList)) { 
    insertEmail($db, $service, $emailList); 
    } 
    $emailList = array(); 
    } 
} 
} 
+0

me gusta la idea de crear varias tablas para cada día hasta el momento tenemos 10 archivos de los clientes con 5k o menos cada uno, después de unos años será una locura, pero es malo que después de algunos años tendremos más de 1000 mesas? – Gabriel

+0

puedes archivarlos en una tabla anual o mensual una vez al año o mes es más –

+0

oh simple muchas gracias – Gabriel

Cuestiones relacionadas