He buscado y buscado desde que comence a programar en PHP, la mejor manera de comprobar si un email es válido o no, y si esta bien escrito y además que sea de un dominio válido con sus DNS y registros MX correctos. En fin, sonaba imposible, pero navegando y googleando, encontré la solución:
function validateMail($email){ $isValid = true; $atIndex = strrpos($email, '@'); if(is_bool($atIndex) && !$atIndex){ $isValid = false; }else{ $domain = substr($email, $atIndex+1); $local = substr($email, 0, $atIndex); $localLen = strlen($local); $domainLen = strlen($domain); if ($localLen < 1 || $localLen > 64){ $isValid = false; }else if ($domainLen < 1 || $domainLen > 255){ $isValid = false; }else if ($local[0] == '.' || $local[$localLen-1] == '.'){ $isValid = false; }else if (preg_match('/\\.\\./', $local)){ $isValid = false; }else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)){ $isValid = false; }else if (preg_match('/\\.\\./', $domain)){ $isValid = false; }else if(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))) { if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))){ $isValid = false; } } if ($isValid && !(checkdnsrr($domain,'MX') || checkdnsrr($domain,'A'))){ $isValid = false; } } return $isValid; } // Para implementarlo if(validateMail('algun@email.com')){ echo 'email valido'; }else{ echo 'email no valido'; }
Aplica cosas básicas como comprobar la existencia del @, además de RFC para el largo máximo permitido por el estándar y expresiones regulares para validar los simbolos. Y por si fuese poco, chequea que el dominio exista (A) y que sus MX sean válidos.
espectacular, busque por internet y solo encontraba validadores malos..
es que don ubu es maestro del codigo XD
Cuando ejecuto el codigo me sale este error:
Fatal error: Call to undefined function checkdnsrr() in C:\ServerWeb\valmail\valmail.php on line 31
Alguna sugerencia ???
Lo que pasa es que checkdnsrr() es una funcion para linux de forma nativa, por ende, no funcionara en ambientes windows.
Lo que podrias hacer seria comentar esa y las 2 lineas siguientes. (Todo el IF)