В стандартной библиотеке нет интерфейса DNS, поэтому вам придется либо свернуть свой собственный, либо использовать стороннюю библиотеку.
Это не быстро меняющаяся концепция, поэтому внешние библиотеки стабильны и хорошо протестированы.
Тот, который я использовал успешно для той же задачи, что и ваш вопрос: PyDNS .
Очень грубый набросок моего кода выглядит примерно так:
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
Другая библиотека, которая может быть лучше / быстрее, чем PyDNS, - это dnsmodule , хотя, похоже, она не выполняла никаких действий с 2002 года по сравнению с последним обновлением PyDNS в августе 2008 года.
Редактировать : Я также хотел бы отметить, что адреса электронной почты не могут быть легко проанализированы с помощью регулярного выражения. Вам лучше использовать функцию parseaddr () в модуле стандартной библиотеки email.utils (см. Мой ответ на этот вопрос , например).