Inicio » Programación » pyEmailChecker: Comprobar si un email existe con Python

pyEmailChecker: Comprobar si un email existe con Python

En esta entrada, tal y como indica su título, os voy a mostrar un pequeño script de Python mediante el cuál podemos saber si una cuenta de correo existe.

Además, lo vamos a comprobar sin hacer uso del comando VRFY del protocolo SMTP, que no tiene por qué estar disponible en todos los servidores de correo.

Este script con este tipo de comprobación puede servirnos para descartar direcciones de correo que vamos encontrando en auditorías, o para completar scripts que generen posibles cuentas de correo a partir de diccionarios, combinaciones de nombre y apellidos, iniciales…

Si tenemos automatizada la generación de patrones podemos automatizar también la comprobación de si alguno existe realmente.

Respecto al código, el funcionamiento es sencillo. Al script le pasamos un par de parámetros: una cuenta de correo a comprobar (obligatorio) y si queremos que muestre el proceso de comprobación por pantalla o sólo los resultados mediante el parámetro “debug” (true mostrará el proceso, false no).

El script lo primero que hace es listar todos los servidores MX del dominio de la cuenta de correo que le hemos proporcionado para, recorriendo todos los que encuentre, comprobar si la cuenta existe en alguno de ellos.

Hasta el momento, todas las pruebas han sido satisfactorias, pero si encontráis alguna pega hacédmelo saber.

Aquí os dejo un vídeo donde se puede ver la ejecución del script con una cuenta que no existe, con una cuenta que sí existe y cómo se ve la depuración cuando proporcionamos el parámetro “–debug True“.

Para abrirlo en YouTube directamente puedes pulsar el título del video o aquí.

Vídeo demostrativo pyEmailChecker

Por último, os dejo el código fuente del script, aunque ya sabéis que mi código no es precisamente “depurado” ya que voy cogiendo un poco de aquí y otro poco de allá y luego me lo compongo a mi gusto.

Un saludo y hasta la próxima.

(Si estáis con dispositivos móviles, poned la pantalla en horizontal y ajustará el código o haced uso de los botones “Raw“, “Copy” o “Extern” de la esquina superior derecha)

#!/usr/bin/python
import smtplib
import DNS
import socket
import argparse


def get_mx(hostname):
    try:
        servidor_mx = DNS.mxlookup(hostname)
    except ServerError as e:
        if e.rcode == 3 or e.rcode == 2:  # NXDOMAIN (Non-Existent Domain) or SERVFAIL
            servidor_mx = None
        else:
            raise
    return servidor_mx


def validar_email(email, debug=False):
    try:
        hostname = email[email.find('@') + 1:]
        mx_hosts = get_mx(hostname)
        if mx_hosts is None:
            print('No se encuentra MX para el dominio {}'.format(hostname))
            return None
        for mx in mx_hosts:
            try:
                print('Servidor {}'.format(mx[1]))
                print('Cuenta {}'.format(email))
                servidor = smtplib.SMTP(timeout=10)
                servidor.connect(mx[1])
                servidor.set_debuglevel(debug)
                status, _ = servidor.helo()
                if status != 250:
                    servidor.quit()
                    continue
                servidor.mail('')
                status, _ = servidor.rcpt(email)
                if status == 250:
                    servidor.quit()
                    return True
                servidor.quit()
            except smtplib.SMTPServerDisconnected:  # Server not permits verify user
                if debug:
                    print('{} disconected.'.format(mx[1]))
            except smtplib.SMTPConnectError:
                if debug:
                    print('Unable to connect to {}.'.format(mx[1]))
        return False
    except (ServerError, socket.error) as e:
        print('ServerError or socket.error exception raised ({}).'.format(e))
        return None


ServerError = DNS.ServerError

if __name__ == "__main__":
    PARSER = argparse.ArgumentParser(
        description="""DESCRIPCIÓN: Este script comprueba si una dirección de correo existe en un MX (intercambiador de correo).""", usage="\n./main.py email@address \n./main.py -h for help", epilog="""Autor : Oscar Navarrete, onavarrete@protonmail.com""")
    PARSER.add_argument('email', help='Dirección de email a comprobar')
    PARSER.add_argument('--debug', required=False, default=False, type=bool, help='Mostrar mensajes por pantalla (True/False)')
    USERSARGS = PARSER.parse_args()

    resultado = validar_email(USERSARGS.email, USERSARGS.debug)
    if resultado:
        print('La cuenta existe')
    elif resultado is None:
        print('No se puede determinar')
    else:
        print('La cuenta no existe')


Deja un comentario

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

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