Validar direcciones de correo electrónico en Python con email-validator

En esta guía, aprenda cómo validar direcciones de correo electrónico en Python con el validador de correo electrónico: verifique su sintaxis y capacidad de entrega en un solo método, así como también cómo manejar errores y extraer mensajes significativos a través de ejemplos prácticos.

Introducción

Ya sea que esté creando un formulario de registro para su sitio web o simplemente necesite eliminar todas las direcciones de correo electrónico no válidas de su lista de correo, no puede evitar realizar el proceso de validación de correo electrónico.

Debe validar si una dirección de correo electrónico es real verificando si cumple con el formulario requerido y puede recibir mensajes de correo electrónico. Eso debe realizarse de manera eficiente y segura.

Ahí es donde entra email-validator. Es una biblioteca de Python fácil de usar, pero robusta, que se utiliza para validar direcciones de correo electrónico.

En esta guía, repasaremos los conceptos básicos de esta biblioteca, descubriremos cuándo y por qué podría usarla, así como cuándo no. Los revisaremos con ejemplos prácticos que lo ayudarán a comprender cómo usar email-validator.

¿Qué es email-validator? {#validador de whatisemail}

Como dijimos anteriormente, email-validator es una biblioteca robusta de Python que valida las direcciones de correo electrónico. Realiza dos tipos de validación: validación de sintaxis y validación de capacidad de entrega. Eso es importante porque la dirección de correo electrónico debe cumplir con el formulario requerido y tener un nombre de dominio resoluble al mismo tiempo para que se considere válida.

{.icon aria-hidden=“true”}

La validación de sintaxis garantiza que una representación de cadena de una dirección de correo electrónico tenga el formato , como [correo electrónico protegido].
Validación de capacidad de entrega garantiza que la dirección de correo electrónico sintácticamente correcta tenga el nombre de dominio (la cadena después del signo @ - wikihtp.com) que se puede resolver.

En términos simples, asegura que la dirección de correo electrónico validada pueda enviar y recibir mensajes de correo electrónico.

Además de eso, email-validator tiene una pequeña ventaja para nosotros, si la dirección de correo electrónico es válida, email-validator puede devolver su forma normalizada, para que podamos almacenarla en una base de datos en un forma apropiada. Por otro lado, si una dirección de correo electrónico no es válida, email-validator nos dará un mensaje de error claro y legible por humanos para ayudarnos a entender por qué la dirección de correo electrónico pasada no es válida.

{.icon aria-hidden=“true”}

En su forma más simple, la normalización de una dirección de correo electrónico implica poner en minúsculas el dominio de una dirección de correo electrónico (la secuencia después del signo @), porque no distingue entre mayúsculas y minúsculas.

En casos más complejos de normalización, donde la parte del dominio incluye algunos caracteres Unicode, la normalización cubre una variedad de conversiones entre caracteres Unicode y ASCII. El problema radica en el hecho de que diferentes cadenas Unicode pueden verse y significar lo mismo para el usuario final, por lo que la normalización debe garantizar que esas cadenas se registren de la misma manera porque en realidad representan el mismo dominio.

Es importante mencionar que esta biblioteca no está diseñada para funcionar con una dirección de correo electrónico que no cumpla con la forma de [correo electrónico protegido].

Por ejemplo, no validará correctamente la línea Para: en un mensaje de correo electrónico (por ejemplo, Para: Nombre de ejemplo <[correo electrónico protegido]>).

email-validator frente a RegEx para validación de correo electrónico

Por lo general, usamos algún tipo de Expresión regular (RegEx) para validar la forma correcta de las direcciones de correo electrónico y es una excelente opción si solo necesita asegurarse de que alguna dirección de correo electrónico cumpla con la forma requerida. Es una técnica bien conocida, fácil de escribir y mantener, y no consume demasiada potencia informática para ejecutarse.

If you'd like to read more about validating email addresses with RegEx - read our Python: validar la dirección de correo electrónico con expresiones regulares!

Por otro lado, la validación de direcciones de correo electrónico a veces puede ser mucho más compleja. Una cadena que contiene una dirección de correo electrónico puede cumplir con la forma especificada de una dirección de correo electrónico, pero aún así no puede considerarse una dirección de correo electrónico adecuada, porque el dominio no se resuelve.

Por ejemplo, [correo electrónico protegido] cumple con la forma especificada de una dirección de correo electrónico, pero no es válido porque el nombre de dominio (sswikihtp.com) no existe, por lo tanto no resuelve y la dirección de correo electrónico de ejemplo no puede enviar ni recibir mensajes de correo electrónico.

Por otro lado, [correo electrónico protegido], cumple con ambos requisitos para una dirección de correo electrónico válida. Cumple con la forma deseada y se resuelve el nombre de dominio. Por lo tanto, puede considerarse una dirección de correo electrónico válida.

En ese caso, el email-validator brinda una solución superior: realiza la validación de la sintaxis y la capacidad de entrega con una llamada de función simple, por lo que no hay necesidad de preocuparse por asegurarse de que la dirección de correo electrónico realmente pueda enviar y recibir correos electrónicos. . Sería imposible codificar ambas verificaciones usando solo expresiones regulares.

{.icon aria-hidden=“true”}

Nota: De hecho, es imposible garantizar si se recibirá o no un correo electrónico sin enviar un correo electrónico y observar el resultado. Sin embargo, puede verificar si podría recibir un correo electrónico como una posibilidad categórica.

Esas dos cosas constituyen un caso sólido a favor del email-validator contra las expresiones regulares. Es más fácil de usar y aún puede realizar más tareas de manera más eficiente.

¿Cómo instalar email-validator?

La biblioteca email-validator está disponible en PyPI, por lo que la instalación es bastante sencilla a través de pip o pip3:

1
2
$ pip install email-validator
$ pip3 install email-validator

Y ahora tienes el email-validator listo para usar en un script de Python.

¿Validar la dirección de correo electrónico con email-validator?

El núcleo de la biblioteca email-validator es su método validate_email(). Toma una representación de cadena de una dirección de correo electrónico como argumento y realiza la validación en esa dirección. Si la dirección de correo electrónico pasada es válida, el método validate_email() devolverá un objeto que contiene una forma normalizada de la dirección de correo electrónico pasada, pero en el caso de una dirección de correo electrónico no válida, generará EmailNotValidError con un mensaje de error claro y legible por humanos que nos ayudará a comprender por qué la dirección de correo electrónico pasada no es válida.

EmailNotValidError es en realidad solo una clase abstracta, que se usa para detectar que ocurrió un error en un proceso de validación, por lo tanto, no se usa para representar y describir errores reales.

Para ese propósito, la clase EmailNotValidError tiene dos subclases que describen los errores reales que ocurrieron. El primero es EmailSynaxError que se genera cuando falla una validación de sintaxis, lo que significa que el correo electrónico pasado no cumple con la forma requerida de una dirección de correo electrónico. El segundo es EmailUndeliverableError que se genera cuando falla una validación de capacidad de entrega, lo que significa que el nombre de dominio de la dirección de correo electrónico pasada no existe.

Ahora finalmente podemos echar un vistazo a cómo usar el método validate_email(). Por supuesto, el primer paso es importarlo a nuestro script y luego estamos listos para usarlo:

1
2
3
4
5
6
from email_validator import validate_email

testEmail = "[correo electrónico protegido]"

emailObject = validate_email(testEmail)
print(emailObject.email)

Dado que el testEmail pasado es una dirección de correo electrónico válida, el código anterior generará la forma normalizada de la dirección de correo electrónico almacenada en la variable testEmail:

1
[correo electrónico protegido]

{.icon aria-hidden=“true”}

Nota: En el ejemplo anterior, el resultado es el mismo que la dirección original de testEmail porque originalmente se normalizó. Si pasa la forma no normalizada de un correo electrónico al método validate_email(), la dirección de correo electrónico devuelta se normalizará, como se esperaba.

Si cambiamos el testEmail original a "[correo electrónico protegido]", el código anterior seguirá teniendo la misma salida, porque está normalizado:

1
[correo electrónico protegido]

Por otro lado, si pasamos la dirección de correo no válida al método validate_email(), el código anterior nos indicará el mensaje de error correspondiente. El siguiente ejemplo de testEmail pasará la validación de sintaxis, pero fallará la validación de capacidad de entrega porque el dominio sswikihtp.com no existe:

1
testEmail = "[correo electrónico protegido]"

En este caso, el código anterior generará un largo error entre los cuales se encuentra:

1
2
3
>> ...
>> raise EmailUndeliverableError("The domain name %s does not exist." % domain_i18n)
email_validator.EmailUndeliverableError: The domain name sswikihtp.com does not exist.

Según este mensaje, podemos concluir que el correo electrónico enviado no es válido porque su nombre de dominio no existe. Los mensajes correspondientes también se solicitarán en el caso de correos electrónicos sintácticamente inválidos para que podamos concluir fácilmente que la dirección de correo electrónico pasada no cumple con la forma requerida de una dirección de correo electrónico.

También podría extraer un mensaje de error más fácil de usar y legible por humanos de esto, automáticamente. Para extraer solo el mensaje de error del aviso anterior, necesitamos reescribir el código anterior de la siguiente manera:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from email_validator import validate_email, EmailNotValidError

testEmail = "examplewikihtp.com"

try:
    # Validating the `testEmail`
    emailObject = validate_email(testEmail)

    # If the `testEmail` is valid
    # it is updated with its normalized form
    testEmail = emailObject.email
    print(testEmail)
except EmailNotValidError as errorMsg:
    # If `testEmail` is not valid
    # we print a human readable error message
    print(str(errorMsg))

Este código generará solo un mensaje de error simple extraído del mensaje anterior:

1
The domain name sswikihtp.com does not exist.

{.icon aria-hidden=“true”}

Nota: Hemos aprovechado la clase EmailNotValidError. Hemos intentado ejecutar la validación del correo electrónico en el bloque try y nos aseguramos de que el error se detecte en el bloque excepto en caso de fallar la validación. No es necesario capturar EmailSyntaxError o EmailUndeliverableError individualmente, porque ambos son subclases de la clase capturada EmailNotValidError, y el tipo de error se puede determinar fácilmente mediante el mensaje de error impreso.

validate_email() - Argumentos opcionales

De forma predeterminada, el método validate_email() acepta solo un argumento: la representación de cadena de la dirección de correo electrónico que debe validarse, pero puede aceptar algunos otros argumentos de palabras clave:

  • allow_smtputf8: el valor predeterminado es Verdadero, si se establece en Falso validate_email() no validará las direcciones de correo electrónico internacionalizadas, solo las que tengan un nombre de dominio que consista únicamente en caracteres ASCII (en ese caso, no se permiten caracteres UTF-8 en un nombre de dominio).
  • check_deliverability: el valor predeterminado es True, si se establece en False, no se realiza ninguna validación de capacidad de entrega.
  • allow_empty_local: el valor predeterminado es False, si se establece en True, se permitirá la parte local vacía de una dirección de correo electrónico (es decir, @wikihtp.com se considerará como el correo electrónico válido Dirección).

El objeto *Correo electrónico validado * {#el objeto de correo electrónico validado}

Probablemente haya notado que hemos estado accediendo a la forma normalizada de una dirección de correo electrónico por emailObject.email. Esto se debe a que el método validate_email() devuelve el objeto ValidatedEmail (en ejemplos anteriores, se almacenaba en la variable emailObject) cuando se pasa una dirección de correo electrónico válida como argumento.

El objeto ValidatedEmail contiene múltiples atributos que describen diferentes partes de la dirección de correo electrónico normalizada. El atributo email contiene la forma normalizada de la dirección de correo electrónico validada, por lo tanto, necesitamos acceder a ella usando la notación . - emailObject.email.

En general, podemos acceder a cualquier atributo del objeto ValidatedEmail usando variableName.attributeName (donde variableName es la variable utilizada para almacenar el objeto ValidatedEmail).

Por ejemplo, digamos que hemos validado el [correo electrónico protegido] con el método validate_email(). El objeto ValidatedEmail resultante contendrá algunos atributos interesantes y útiles como se describe en la siguiente tabla:

Attribute Name   Example Value                      Description

    email        \[correo electrónico protegido\]   Normalized form of an email address.
 ascii_email     \[correo electrónico protegido\]   ASCII only form of `email` attribute. If the `local_part` contains any kind of internationalized characters, this attribute will be set to `None`.
  local_part     example                            The string before the `@` sign in the normalized form of the email address.

Ejemplo de ascii_local_part Si no hay caracteres internacionalizados, este atributo se establece en la forma ASCII únicamente del atributo local_part. De lo contrario, se establece en Ninguno. domain wikihtp.com The string after the @ sign in the normalized form of the email address. If it contains non-ASCII characters, the smptutf8 attribute must be True. ascii_domain wikihtp.com ASCII only form of domain attribute. smtputf8 True A boolean value. If the allow_smtputf8=False argument is passed to the validate_email() method, this argument is False and True otherwise.

{.icon aria-hidden=“true”}

Nota: Las variantes ASCII de los atributos mencionados se generan utilizando la sintaxis de codificación Punycode. Es una sintaxis de codificación utilizada para transformar una cadena Unicode en una cadena ASCII para usar con Nombres de dominio internacionalizados en aplicaciones (IDNA).

Conclusión

Con todo, el email-validator es una gran herramienta para validar direcciones de correo electrónico en Python.

En esta guía, hemos cubierto todos los aspectos importantes del uso de esta biblioteca, para que tenga una visión completa de ella. Debería poder comprender cuándo y cómo usar el email-validator, así como cuándo elegir alguna herramienta alternativa.