Как проверить запись MX для домена в Python? - PullRequest
14 голосов
/ 18 февраля 2009

У меня есть большое количество адресов электронной почты для проверки. Сначала я анализирую их с помощью регулярных выражений, чтобы выбросить совершенно сумасшедших. У меня остались те, которые выглядят разумными, но все же могут содержать ошибки.

Я хочу выяснить, какие адреса имеют действительные домены, поэтому, учитывая me@abcxyz.com, я хочу знать, можно ли вообще отправлять электронные письма на abcxyz.com.

Я хочу проверить это, чтобы убедиться, что оно соответствует действительной записи A или MX - есть ли простой способ сделать это, используя только стандартную библиотеку Python? Я бы предпочел не добавлять в свой проект дополнительную зависимость только для поддержки этой функции.

Ответы [ 2 ]

16 голосов
/ 18 февраля 2009

В стандартной библиотеке нет интерфейса 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 (см. Мой ответ на этот вопрос , например).

1 голос
/ 05 мая 2016

Простой способ сделать это НЕ в стандартной библиотеке - использовать пакет validate_email :

from validate_email import validate_email
is_valid = validate_email('example@example.com', check_mx=True)

Чтобы ускорить обработку большого количества адресов электронной почты (например, список emails), вы можете спрятать домены и выполнить check_mx, только если домена нет. Что-то вроде:

emails = ["email@example.com", "email@bad_domain", "email2@example.com", ...]
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...