Validar dirección de correo electrónico en Python

Olorunfemi Akinlua 21 junio 2023
  1. Use regex para validar el correo electrónico en Python
  2. Use dnspython para validar el correo electrónico en Python
Validar dirección de correo electrónico en Python

La validación de correo electrónico es una parte importante del viaje del usuario dentro de una aplicación cerrada, y es importante, especialmente para la seguridad y la reducción de la rotación de usuarios. Existen diferentes métodos para validar el correo electrónico, y es importante comprender la estructura de la dirección de correo electrónico típica.

Hay funciones integradas como regex y bibliotecas como dnspython que ayudan con estos procesos. Este artículo explicará cómo usar estas funciones y bibliotecas para validar correos electrónicos en Python.

Use regex para validar el correo electrónico en Python

La expresión regular, popularmente llamada regex, es una secuencia de caracteres que especifica un patrón de búsqueda en el texto y es útil para buscar algoritmos en cadenas y hacer buscar y buscar y reemplazar.

Con regex, podemos encontrar ciertos patrones dentro de la dirección de correo electrónico que recibimos del usuario. Cada dirección de correo electrónico tiene el mismo patrón, [nombre de usuario]@[servidor smtp].com.

Podemos usar regex para encontrar la parte del nombre de usuario y la parte del servidor SMTP. Para comprender cómo usar regex, debe conocer metacaracteres, secuencias especiales y conjuntos.

Usando este conocimiento, podemos crear y compilar un patrón de regex usando el método de “compilar” y usar el método de “coincidencia” para comparar la cadena de la dirección de correo electrónico del usuario para verificarla. En Python, para usar regex, necesitamos la biblioteca re, que admite la expresión regular.

import re

user_email = input("Enter your Email Address: ")
pattern = re.compile(r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?")

if not re.match(pattern, user_email):
    print(f"{user_email} is not a valid email address")
else:
    print(f"Your {user_email} is a valid email address")

Producción :

PS C:\Users\akinl\Documents\Python> python email.py
Enter your Email Address: akin@gm.com
Your akin@gm.com is a valid email address
PS C:\Users\akinl\Documents\Python> python email.py
Enter your Email Address: dx@s
dx@s is not a valid email address

El \"?([-a-zA-Z0-9.?{}]+@\w+\.\w+)\"? string contiene el patrón de expresión regular con el que compararemos la dirección de correo electrónico del usuario.

Con la primera entrada, akin@gm.com, el correo electrónico contiene todos los patrones y la estructura necesarios para crear un correo electrónico válido desde el nombre de usuario al servidor SMTP. Sin embargo, para dx@s, el servidor SMTP es inexistente.

También podemos verificar si hay una coincidencia usando el método fullmatch, que es el más preferido con Python 3.x. El código es similar, pero todo lo que necesitamos cambiar es el método match a fullmatch.

La diferencia entre match y fullmatch es que match coincide solo al principio, mientras que fullmatch coincide con todo el texto de la cadena hasta el final.

import re

user_email = input("Enter your Email Address: ")
pattern = re.compile(r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?")

if not re.fullmatch(pattern, user_email):
    print(f"{user_email} is not a valid email address")
else:
    print(f"Your {user_email} is a valid email address")

Producción :

PS C:\Users\akinl\Documents\Python> python email.py
Enter your Email Address: akin@gmail.com
Your akin@gmail.com is a valid email address

Con esto, podemos comprobar si existe una estructura de correo electrónico válida, aunque no podemos comprobar si existe el servidor SMTP, que es igualmente importante. Ahí es donde entra la siguiente característica.

Use dnspython para validar el correo electrónico en Python

Con la biblioteca dnspython, podemos validar la parte SMTP del correo electrónico para ver si es real y no inventado. Después de verificar y validar el correo electrónico, podemos dividir la parte del servidor SMTP y verificar usando el método resolver.

Dado que dnspython no es una biblioteca integrada, debemos instalarla a través de pip.

pip install dnspython

Después de instalar dnspython, podemos importarlo a nuestro código y usar el método resolve para buscar un servidor SMTP válido.

import dns.resolver

try:
    answers = dns.resolver.resolve("google.com", "MX")
    for rdata in answers:
        print("Host", rdata.exchange, "has preference", rdata.preference)
    print(bool(answers))
except dns.exception.DNSException as e:
    print("Email Doesn't Exist")

Producción :

Host smtp.google.com. has preference 10
True

Para verificar el servidor SMTP, pasamos el atributo MX al método resolve para verificar el registro de “intercambio de correo”, y los rdata devueltos son útiles para ver los valores de los atributos “intercambio” y “preferencia”.

Sin embargo, lo importante es verificar si hay valores dentro del enlace respuesta utilizando la función bool. Si no hay valores allí, significa que el servidor SMTP no es válido.

Para realizar una verificación exhaustiva de la validación del correo electrónico, podemos combinar los códigos regex y dnspython.

import dns.resolver
import re

user_email = input("Enter your Email Address: ")
pattern = re.compile(r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?")

if not re.fullmatch(pattern, user_email):
    print(f"{user_email} is not a valid email address.")
else:
    domain = user_email.rsplit("@", 1)[-1]

    try:
        answers = dns.resolver.resolve(domain, "MX")
        if bool(answers):
            print(f"Your {user_email} is a valid email address.")
    except dns.exception.DNSException as e:
        print("Not a valid email server.")

Producción :

PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: akin@gmail.com
Your akin@gmail.com is a valid email address.
PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: ds.cem@fex.co
Your ds.cem@fex.co is a valid email address.
PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: wer@fghj.com
Your wer@fghj.com is a valid email address.
PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: df@werabsjaksa.com
Not a valid email server.
PS C:\Users\akinl\Documents\Python> python testEmail.py
Enter your Email Address: des@python.exe
Not a valid email server.

La sección probar/excepto ayuda a tratar ciertas excepciones cuando el servidor SMTP no existe.

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

Artículo relacionado - Python Email