Cómo validar que un correo existe usando PHP

Seguramente alguna vez te habrás topado con la necesidad de registrar correos electrónicos de los visitantes de tu sitio, ¿cierto?

Usualmente esto se hace para mantenerlos al tanto de las novedades.

Claro que, aunque vos tengas las mejores intenciones, es entendible que la gente sea un poco escéptica con tanto spammer dando vueltas, por lo tanto, no es raro que muchos llenen el campo correo electrónico con basura, lo cual no sirve más que para hacer crecer tu base de datos inútilmente.

¿Qué podés hacer para evitar esto?

Hay varias medidas que se pueden tomar, te voy a comentar algunas:

Cómo validar que el texto sea una dirección de correo electrónico

Lo primero de lo que deberías asegurarte es de que el texto ingresado por el usuario es (o al menos podría ser) una dirección de correo electrónico.

Para hacer esto tenés dos opciones: hacerlo desde el frontend o desde el backend. Si tenés dudas de cuál te conviene te recomiendo este artículo.

Me voy a concentrar en la validación del lado del servidor que es la que efectivamente se hará usando PHP.

Asumamos que se recibe un POST que incluye un campo email y necesitamos verificar su contenido.

Como de costumbre, existen muchas formas de hacerlo pero ciertamente hay una que supera a las demás: usar las herramientas incorporadas.

Concretamente me refiero a la función filter_var, se puede usar de esta forma:

<?php

echo (filter_var($argv[1], FILTER_VALIDATE_EMAIL) ? 'Es email' : 'No es email').PHP_EOL;

Corriendo este script de esta forma:

php test.php mauro.chojrin@leewayweb.com

Obtendrás esta salida:

Es email

Mientras que si lo ejecutas así:

php test.php mauro.chojrin.leewayweb.com

La salida será:

No es email

Hasta aquí pinta bien, ¿cierto? Pero… ¿es realmente una dirección de correo? Es decir, ¿existe una casilla de correo que responda a esa dirección?

Cómo validar que la dirección ingresada exista

Como decía, que el texto ingresado cumpla con el formato de una dirección de correo es condición necesaria pero no suficiente para nuestros propósitos.

Necesitamos algo más sólido.

Algo que podemos usar es una validación a nivel de SMTP, es decir, intentar enviar un correo y ver qué responde el servidor que, supuestamente, debería recibirlo.

Implementar esto desde 0 es, claramente, una tarea compleja.

Mejor apoyarnos en alguna librería existente. Por ejemplo esta.

La instalamos usando composer así:

composer require zytzagoo/smtp-validate-email --update-no-dev

Y luego podemos usar un código como este:

<?php

require 'vendor/autoload.php';

use SMTPValidateEmail\Validator as SmtpEmailValidator;

$validator = new SmtpEmailValidator($argv[1], 'sender@example.org');

$results   = $validator->validate();

echo $results[$argv[1]] ? 'El email existe' : 'El email no existe';

echo PHP_EOL;

Y al ejecutar esto:

php test.php mauro.chojrin@leewayweb.com

Nos confirmará que la dirección existe.

Nos queda sólo una pequeña duda… ¿hay alguien leyendo esos emails?

Cómo validar que alguien chequea esa casilla

Esta parte es un poco más compleja, aunque definitvamente es lo mejor que se puede hacer.

Un método muy conocido es el doble opt-in.

Se trata de enviar un correo pidiendo la confirmación y sólo activar el registro cuando alguien haga click en el link que contiene dicho correo.

Una forma de implementarlo es crear un campo adicional dentro de la tabla de usuarios que se llene con un token, el cual será enviado a la dirección introducida por el usuario dentro de un link similar a:

http://tusitio.com/users/activate.php?token=$token

Del lado de activate.php tenés que buscar un usuario cuyo token coincida con el parámetro recibido y, en tal caso, marcar el registro como activo.

En este video podés ver un ejemplo de solución de un problema parecido (El recupero de contraseña).

Recapitulando

En este post hablamos de tres modos de validar que un correo recibido sea, efectivamente, un correo.

Cada una de las formas es un poco más compleja (y certera) que la anterior.

¿Cuál deberías usar? Idealmente las tres.

¿Por qué las tres? Simplemente porque el aumento de complejidad también implica una menor eficiencia entonces si un dato debería ser descartado, lo mejor es hacerlo lo antes posible de modo de ahorrar recursos de tu servidor y tiempo de tus usuarios.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a afinar sus habilidades técnicas y avanzar en sus carreras

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.