Foros del Web » Programando para Internet » PHP »

Saber si una dirección es incorrecta con el phpmailer

Estas en el tema de Saber si una dirección es incorrecta con el phpmailer en el foro de PHP en Foros del Web. Hola a todos, estoy trabajando con el phpmailer para el envío de mails desde mi web y funciona correctamente. Sin embargo, necesito saber si una ...
  #1 (permalink)  
Antiguo 21/05/2010, 00:48
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 18 años, 5 meses
Puntos: 1
Saber si una dirección es incorrecta con el phpmailer

Hola a todos,

estoy trabajando con el phpmailer para el envío de mails desde mi web y funciona correctamente. Sin embargo, necesito saber si una dirección introducida por el usuario es válida o no.

Si el usuario introduce una dirección inválida al estilo: "asdfasdfjhsdjfh", el send devuelve un error y puedo avisar al usuario de que la dirección no es válida.

Sin embargo, si el usuario introduce una dirección del estilo: [email protected], el send se ejecuta y, al parecer, envía algo a esa dirección aunque no exista.
Al menos no me da problemas y la función send() no devuelve false.

Parece ser que detecta que es una "posible" dirección válida al llevar el carácter "@" y no se queja, pero yo necesito asegurarme de que el mail ha llegado correctamente a su destino.
¿Cómo lo hago?

¿Alguien sabe si hay alguna función que te garantice esto?

Mi código:

//se envia el mensaje, si no ha habido problemas
//la variable $exito tendra el valor true

$exito = $mail->Send();

//Si el mensaje no ha podido ser enviado se realizaran 4 intentos mas como mucho
//para intentar enviar el mensaje, cada intento se hara 5 segundos despues
//del anterior, para ello se usa la funcion sleep

$intentos=1;
while ((!$exito) && ($intentos < 5)) {
sleep(5);

//echo $mail->ErrorInfo;

$exito = $mail->Send();
$intentos=$intentos+1;

}


He probado 3 opciones.

Dirección válida: [email protected] -> Se envía correctamente.
Dirección inválida: dkfjgskdfjgksdfjgksdjfkgj -> El Send devuelve false y, tras 5 intentos muestra el error y no envía el mail.
Dirección válida pero inexistente: [email protected] He aquí mi problema, el send no devuelve false y yo no me entero de si se ha enviado o no el mail.

¿Cómo lo averiguo
Un saludo

Última edición por Tarzan; 21/05/2010 a las 02:24
  #2 (permalink)  
Antiguo 21/05/2010, 07:41
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Saber si una dirección es incorrecta con el phpmailer

Ya esto no se resuelve solamente con PHP. Necesitas del servidor SMTP para lograrlo. Con fsockopen envías una petición al servidor SMTP y luego lees lo que indicó y ahí haces los arreglos pertinentes. Aunque lo que creo que sería más útil es enviar la petición y que el usuario te valide. Después de ahí permites que vea la información que quieras.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 25/05/2010, 02:14
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 18 años, 5 meses
Puntos: 1
Respuesta: Saber si una dirección es incorrecta con el phpmailer

Buenas,

He estado investigando mucho sobre este tema y he llegado a algunas conclusiones. Aunque también a un mar de dudas.

El caso es que, realmente, según he leído por ahí, tampoco hay que comprobar al 100% que la dirección introducida existe. Hay otras formas más sencillas de dirigir al usuario y validar el mail introducido.

Me explico. Voy a utilizar dos funciones muy cortitas. Una para validar la “sintaxis” del mail y otra para validar “el dominio”. Si el dominio existe y la sintaxis es correcta pues palante!!
Si alguna de las dos falla, pues mensaje al canto y vuelve a introducir el e-mail.

Es lo que prefiero hacer. Si la sintaxis es correcta, el dominio existe y luego resulta que la dirección no tiene usuario o no se ha creado nunca. Pues nada. Al cabo de varios días, si veo que hay una cuenta sin activar, me la cepillo y andando.

Entonces: Ahora necesito ése par de funciones y en Internet he visto un chorro. ¿Cuál elijo?. A ver si alguien puede aconsejarme a elegir la más sabia y correcta porque ayer copié yo una para validar el dominio y, cuando introducía hotmxxxailx.kom me daba OK y eso está mal.

He encontrado esta función, donde dicen que sirve para validar el dominio pero no he podido probarla y no entiendo muy bien cómo lo hace:

function getAddrByHost($host, $timeout = 3) {
$query = "nslookup -timeout=$timeout -retry=1 $host";
if(preg_match("/ Address: (.*) /", $query, $matches)){
return trim($matches[1]);
}else{
return false;
}
return $host;
}


Se supone que realiza una ejecución del comando nslookup, (en la consola). Evidentemente, eso debería devolver si existe o no pero aquí yo no veo donde ejecuta ese comando. ¿Cómo lo hace?

Esta es otra función para validar el dominio por el DNS.

function validar_email($email){
$exp = "^[a-z'0-9]+([._-][a-z'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
if(eregi($exp,$email)){
if(checkdnsrr(array_pop(explode("@",$email)),"MX") ){
return true;
}else{
return false;
}
}else{
return false;
}
}


¿Cómo lo veis?, ¿mejor checkdnsrr o nslookup?
También hay otra opción pero no he conseguido que funcione

$validar = @fsockopen($dominio, 25, $errno, $errstr, 30);

En teoría, con esta función se conecta por el puerto 25 y valida el dominio pero ya te digo yo que con hotmXXXXilX.kom devuelve true.

Para validar la sintaxis: (pongo las dos que conseguí).

function validar_correo($correo) {
return preg_match('/^.+@(.+\..+)$/', $correo);
}

function validar_correo($correo) {
return preg_match("^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@([_a-zA-Z0-9-]+.)*[a-zA-Z0-9-]{2,200}.[a-zA-Z]{2,6}$", $correo);
}


Hay quien opina que es mejor la primera porque la segunda te filtra algunos correos permitidos, aunque raros, pero yo prefiero que invalide todo lo que no sea una dirección de mail.
¿Cuál os convence más? ¿Qué debo modificar para que vaya?

Un saludo.

Última edición por Tarzan; 25/05/2010 a las 04:22

Etiquetas: incorrecta, phpmailer
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 19:11.