Saltar al contenido

¿Cómo verificar una dirección de correo electrónico válida?

Encontramos la contestación a este contratiempo, o por lo menos eso pensamos. Si sigues con preguntas puedes dejar un comentario, que sin dudarlo te responderemos

Solución:

No tiene sentido. Incluso si puede verificar que la dirección de correo electrónico es sintácticamente válida, deberá verificar que no esté mal escrita y que realmente se dirija a la persona que cree que sí. La única forma de hacerlo es enviarles un correo electrónico y hacer que hagan clic en un enlace para verificar.

Por lo tanto, una verificación más básica (por ejemplo, que no ingresaron accidentalmente su dirección postal) suele ser suficiente. Algo como: tiene exactamente uno @ firmar, y al menos uno . en la parte posterior a la @:

[^@][email protected][^@]+.[^@]+

Probablemente también desee rechazar los espacios en blanco; probablemente haya direcciones de correo electrónico válidas con espacios en blanco, pero nunca he visto una, por lo que las probabilidades de que esto sea un error de usuario están de su lado.

Si desea la verificación completa, eche un vistazo a esta pregunta.


Actualización: así es como puede usar cualquier expresión regular:

import re

if not re.match(r"... regex here ...", email):
  # whatever

Python ≥3.4 tiene re.fullmatch que es preferible a re.match.

Nota la r en frente de string; de esta manera, no necesitará escapar de las cosas dos veces.

Si tiene una gran cantidad de expresiones regulares para verificar, podría ser más rápido compilar la expresión regular primero:

import re

EMAIL_REGEX = re.compile(r"... regex here ...")

if not EMAIL_REGEX.match(email):
  # whatever

Otra opción es utilizar el validate_email paquete, que en realidad se pone en contacto con el servidor SMTP para verificar que existe la dirección. Sin embargo, esto todavía no garantiza que pertenezca a la persona adecuada.

La biblioteca estándar de Python viene con una función de análisis de correo electrónico: email.utils.parseaddr().

Devuelve una tupla de dos que contiene el nombre real y las partes de la dirección real del correo electrónico:

>>> from email.utils import parseaddr
>>> parseaddr('[email protected]')
('', '[email protected]')

>>> parseaddr('Full Name <[email protected]>')
('Full Name', '[email protected]')

>>> parseaddr('"Full Name with quotes and <[email protected]>" <[email protected]>')
('Full Name with quotes and <[email protected]>', '[email protected]')

Y si el análisis no tiene éxito, devuelve dos tuplas de cadenas vacías:

>>> parseaddr('[invalid!email]')
('', '')

Un problema con este analizador es que acepta cualquier cosa que se considere una dirección de correo electrónico válida para RFC-822 y amigos, incluidas muchas cosas que claramente no son direccionables en Internet:

>>> parseaddr('[email protected],com') # notice the comma
('', '[email protected]')

>>> parseaddr('invalid-email')
('', 'invalid-email')

Entonces, como dijo @TokenMacGuy, la única forma definitiva de verificar una dirección de correo electrónico es enviar un correo electrónico a la dirección esperada y esperar a que el usuario actúe sobre la información dentro del mensaje.

Sin embargo, es posible que desee verificar, al menos, la presencia de un signo @ en el segundo elemento de tupla, como sugiere @bvukelic:

>>> '@' in parseaddr("invalid-email")[1]
False

Si desea ir un paso más allá, puede instalar el proyecto dnspython y resolver los servidores de correo para el dominio de correo electrónico (la parte después de la ‘@’), solo intentando enviar un correo electrónico si existen MX servidores:

>>> from dns.resolver import query
>>> domain = '[email protected]@google.com'.rsplit('@', 1)[-1]
>>> bool(query(domain, 'MX'))
True
>>> query('example.com', 'MX')
Traceback (most recent call last):
  File "", line 1, in 
  [...]
dns.resolver.NoAnswer
>>> query('not-a-domain', 'MX')
Traceback (most recent call last):
  File "", line 1, in 
  [...]
dns.resolver.NXDOMAIN

Puedes atrapar ambos NoAnswer y NXDOMAIN atrapando dns.exception.DNSException.

Y si, [email protected]@google.com es una dirección sintácticamente válida. Solo el ultimo @ debe tenerse en cuenta para detectar dónde comienza la parte del dominio.

No he visto la respuesta ya aquí entre el lío de respuestas personalizadas de Regex, pero …

Existe una biblioteca de Python llamada py3-validate-emailvalidar correo electrónico que tiene 3 niveles de validación de correo electrónico, incluida la pregunta a un servidor SMTP válido si la dirección de correo electrónico es válida (sin enviar un correo electrónico).

Instalar

python -m pip install py3-validate-email

Uso básico:

from validate_email import validate_email
is_valid = validate_email(email_address='[email protected]', 
    check_regex=True, check_mx=True, 
    from_address='[email protected]', helo_host='my.host.name',  
    smtp_timeout=10, dns_timeout=10, use_blacklist=True)

Para aquellos interesados ​​en los detalles sucios, validate_email.py (fuente) tiene como objetivo ser fiel a RFC 2822.

Todo lo que realmente estamos haciendo es comparar la entrada string a una gigantesca expresión regular. Pero construir esa expresión regular, y asegurar su corrección, se hace mucho más fácil al ensamblarla a partir de los “tokens” definidos por el RFC. Cada uno de estos tokens se prueba en el archivo de prueba unitario adjunto.


usted mayo necesita el módulo pyDNS para verificar servidores SMTP

pip install pyDNS

o desde Ubuntu

apt-get install python3-dns

Tienes la posibilidad recomendar este tutorial si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *