2009-02-18 19 views
14

Tengo una gran cantidad de direcciones de correo electrónico para validar. Inicialmente los analizo con expresiones regulares para descartar los completamente locos. Me quedan los que parecen sensatos, pero aún pueden contener errores.¿Cómo valido el registro MX de un dominio en python?

Quiero encontrar las direcciones que tienen dominios válidos, por lo que me han [email protected] Deseo saber si es posible enviar correos electrónicos a abcxyz.com.

Quiero probar eso para ver si corresponde a un registro A o MX válido - ¿hay alguna manera fácil de hacerlo utilizando solo la biblioteca estándar de Python? Prefiero no agregar una dependencia adicional a mi proyecto solo para admitir esta característica.

+0

en sentido estricto, un dominio puede recibir correo, incluso sin un MX record rfc2811, la sección 5 describe un retroceso a los registros a lo consideraría jugando a través de partes de una sesión smtp (hasta hasta RCPT TO :) – hop

+0

@hop: no sabía sobre el retroceso, gracias por su referencia. Creo que te refieres a RFC 2821? –

+0

2821, por supuesto! – hop

Respuesta

16

No hay una interfaz DNS en la biblioteca estándar, por lo que tendrá que hacerla usted mismo o utilizar una biblioteca de terceros.

Sin embargo, este no es un concepto que cambia rápidamente, por lo que las bibliotecas externas son estables y están bien probadas.

El que he utilizado con éxito para la misma tarea que su pregunta es PyDNS.

Un bosquejo muy aproximada de mi código es algo como esto:

import DNS, smtplib 

DNS.DiscoverNameServers() 
mx_hosts = DNS.mxlookup(hostname) 

# Just doing the mxlookup might be enough for you, 
# but do something like this to test for SMTP server 
for mx in mx_hosts: 
    smtp = smtplib.SMTP() 
    #.. if this doesn't raise an exception it is a valid MX host... 
    try: 
     smtp.connect(mx[1]) 
    except smtplib.SMTPConnectError: 
     continue # try the next MX server in list 

Otra biblioteca que podría ser mejor/más rápido que PyDNS es dnsmodule aunque parece que no ha tenido ninguna actividad desde el año 2002, en comparación a PyDNS última actualización en agosto de 2008.

Editar: También me gustaría señalar que las direcciones de correo electrónico no se pueden analizar fácilmente con una expresión regular. Es mejor que use la función parseaddr() en el módulo de la biblioteca estándar email.utils (vea mi answer to this question por ejemplo).

1

La manera más fácil de hacer esto NO en la biblioteca estándar es utilizar el validate_email package:

from validate_email import validate_email 
is_valid = validate_email('[email protected]', check_mx=True) 

Para resultados más rápidos para procesar un gran número de direcciones de correo electrónico (por ejemplo, la lista emails, se podía esconder los dominios Sólo hacer una check_mx si el dominio no existe algo como:...

emails = ["[email protected]", "[email protected]_domain", "[email protected]", ...] 
verified_domains = set() 
for email in emails: 
    domain = email.split("@")[-1] 
    domain_verified = domain in verified_domains 
    is_valid = validate_email(email, check_mx=not domain_verified) 
    if is_valid: 
     verified_domains.add(domain) 
Cuestiones relacionadas