Foros del Web » Programando para Internet » PHP »

Returned mail: cómo borrarlos de la BD ?

Estas en el tema de Returned mail: cómo borrarlos de la BD ? en el foro de PHP en Foros del Web. HOLA Somos una empresa joven que nos dedicamos al desarrollo web, entre otras cosas. Lo que hacemos es un mailing masivo a gran cantidad de ...
  #1 (permalink)  
Antiguo 28/06/2006, 10:47
 
Fecha de Ingreso: junio-2006
Mensajes: 14
Antigüedad: 11 años, 5 meses
Puntos: 0
Pregunta Returned mail: cómo borrarlos de la BD ?

HOLA

Somos una empresa joven que nos dedicamos al desarrollo web, entre otras cosas. Lo que hacemos es un mailing masivo a gran cantidad de usuarios, registrados en una BD. El problema es que muchas direcciones, aún siendo correctas sintácticamente, han quedado obsoletas, desactivadas, etc... y se nos devuelve el email al servidor con asunto "returned mail", de "Mail Delivery Subsystem".

Lo que queremos es saber si se puede, si hay alguna manera (y cómo) de borrar automáticamente estas direcciones de la base de datos, para no tener que hacerlo manualmente, ya que son muchas.

¿Podríamos capturar esos emails desde PHP, y recoger la dirección inválida en una variable, por ejemplo? ¿o es un disparate?

Cualquier sugerencia o ayuda se agradecerá.

Saludos
  #2 (permalink)  
Antiguo 28/06/2006, 10:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 11 años, 6 meses
Puntos: 2122
Si si se puede, tendrian que implementar un sistema en PHP, en el cual entre al servidor POP (o IMAP), y lea todos los correos, si ve un correo que diga Returned Mail, que extraiga la direccion y la borre de la base de datos, es bastante sencillo.
  #3 (permalink)  
Antiguo 28/06/2006, 10:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
¿podríamos capturar esos emails desde PHP, y recoger la direccion inválida en una variable, por ejemplo? ¿o es un disparate?
No es un disparate ..

Con PHP puedes conectarte a tu cuenta de e-mail vía funciones IMAP (siempre y cuando tenga acceso IMAP/POP):

www.php.net/imap

Luego tocaría "parsear" vía expresiones regulares ese e-mail en busca de tus mensajes de errores textuales y dirección de e-mail. Teniendo en cuenta que NO todo servidor responde con el mismo mensaje ante el mismo problema (lamenteablemente no todos siguen los standares) .. ahí podrías tener problemas a la hora de ejecutar este proceso (tendrás que investigar).

Por otro lado .. no sé como envian esos e-mail's pero muchos de esos problemas de direcciones de correo "muertas" se podría ir filtrando si realizas una conexión SMTP directa y esperas el error.

Puedes ver esta técnica en este tutorial:
http://www.devshed.com/c/a/PHP/Email...on-with-PHP/5/

Este método tampoco es la panacea .. muchos servidores SMTP toman el e-mail y hacen reintentos durante cierto tiempo (pueden ser horas .. días ..) por N veces para decidir si realmente funciona o no la dirección de correo o hay algún otro problema .. La comunicación SMTP directa se hace por "sockets" .. socket que queda abierto por un tiempo limitado (corto) .. es decir, no se puede esperar tu script PHP eternamente a ver que mensaje de error devuelve ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 29/06/2006, 04:39
 
Fecha de Ingreso: junio-2006
Mensajes: 14
Antigüedad: 11 años, 5 meses
Puntos: 0
Hola,

La solución del tutorial que propones tiene buena pinta. Lo malo es que no podemos saber a priori si falla el servidor de correo o es la dirección que está obsoleta, (entre otros posibles fallos).

No obstante, podemos mediante un contador agregado a la base de datos, hacer un par de intentos de conexión a la dirección en cuestión (uno por día o por semana, por ejemplo) y borrar la dirección de la base de datos si ha fallado en ambos casos. (o n intentos, en nuestro caso, creo que con 2, separados cada uno por una semana, es suficiente)

De momento probaremos de esta manera y si no conseguimos solucionarlo, volveré a escribir.

Gracias compañeros.
  #5 (permalink)  
Antiguo 06/07/2006, 03:03
 
Fecha de Ingreso: junio-2006
Mensajes: 14
Antigüedad: 11 años, 5 meses
Puntos: 0
Mensaje Código solución que falla

Hola otra vez.

Tras echarle un vistazo al tutorial que proponías y combinando código de otra función que ya hacía una limpieza de emails, cree la siguiente función:


// $tabla es la tabla usuario, altas, concursante...
// $campo es el campo del email (email, Email, direccion...)
// $clave es el nombre del campo a buscar para borrar (normalmente un codigo, o el propio email...)
function limpiar($tabla, $campo, $clave)
{
// expresion que verifica que el correo sea del tipo [email protected]
$expresion = "/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/";

$consulta = "SELECT * FROM ".$tabla.";";
$resultado = mysql_query($consulta) or die (mysql_error());

// Funciona si el campo clave es numérico o alfanumérico (lo intenta de las dos formas y continua)

$borradoALFA ="DELETE FROM ".$tabla." WHERE ".$clave." LIKE '".$fila[$clave]."';";
$borradoNUME ="DELETE FROM ".$tabla." WHERE ".$clave." = ".$fila[$clave].";";


while ($fila = mysql_fetch_array($resultado, MYSQL_ASSOC))
{ // si no tiene el formato correcto, lo borra:
if(!preg_match($expresion, $email)) mysql_query($borradoALFA) or mysql_query($borradoNUME) or die(mysql_error());
else
{ // Si tiene la sintaxis [email protected] comprueba:
$email = $fila[$campo]; // captura el email
list($username,$domain)=split('@',$email); // separa el usuario y el dominio
// si el dominio no es de correo, lo borra:
if (!checkdnsrr($dominio,MX)) mysql_query($borradoALFA) or mysql_query($borradoNUME) or die(mysql_error());
else // si es todo correcto, comprueba que la dirección existe y el servidor está disponible.
if(!fsockopen($domain,25,$errno,$errstr,30)) mysql_query($borradoALFA) or mysql_query($borradoNUME) or die(mysql_error());
}
}
}


Lo que pasa es que no funciona y no encuentro el fallo.
¿Alguien lo ve?

Gracias de nuevo.
  #6 (permalink)  
Antiguo 06/07/2006, 03:26
 
Fecha de Ingreso: junio-2006
Mensajes: 14
Antigüedad: 11 años, 5 meses
Puntos: 0
No sirve del todo

Me acabo de dar cuenta de que este método no llega a hacer lo que esperamos. Releyendo el texto del tutorial, dice:
"If the connection is successfully established, the function will return true, which means that the SMTP server is up and running, the email domain is real and, hopefully, there is a valid user for that domain."

Así que comprueba que la sintaxis del email es correcta, que el dominio está disponible y es de correo, pero no nos confirma que el usuario es válido, sólo lo supone (hopefully).

Habrá que seguir buscando. Ahora investigaré la otra solución, aunque parece un poco más compleja, la de conectarse al pop de la cuenta ...

De todas formas, si alguien ve algún error en la función que puse anteriormente, que lo diga.

Saludos

Última edición por pepe79; 06/07/2006 a las 03:37
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:52.