Проверка на наличие ip адреса в SPF с помощью Python

Мне потребовалось быстрое решение, чтобы проверять может ли определенный IP адрес, отправлять письма с заданным email-адресом.

Быстрым решением оказалось проверка TXT записи у домена, и проверка наличия IP адреса в SPF.

Для работы функции, потребуется dnspython

pip install dnspython

Вот сама функция:

def has_spf(from_email, ip_server):
    """
    "v=spf1" "mx" "include:ofsys.com" "ip4:91.199.80.86" "ip4:91.199.80.56" "ip4:91.199.80.87" "ip4:91.199.80.57" "ip4:91.199.80.90" "ip4:212.24.56.44" "a:post.kompulink.ru" "-all"
    """
    hostname = from_email.split('@')[1]
    resolver = dns.resolver.Resolver()
    answers = resolver.query(hostname, "TXT")
    search_pattern = "v=spf1(.*)(\W+)ip4:{0}(\W+)(.*)all".format(ip_server)

    for answer in answers:
        m = re.search(search_pattern, str(answer))
        if m is not None:
            return True
    return False

Пример вызова даной функции:

In [37]: has_spf('info@svyaznoy.ru', '33.122.54.132')
Out[37]: True

Ограничения

Это очень топорный способ. Он учитывает только прямое вхождения ip-адреса в SPF. Таким образом, этот способ не сработает в случае, если в SPF указана подсеть, а не конкретный IP адрес. Наверняка, есть еще масса интересных моментов, которые зарыты в стандартах SPF, которые мне для быстрого решения задачи изучать не требовалось. Тем кому нужен 100% надежный способ проверки SPF  записей, придется искать более надежный способ. 

Опубликовано: 3 апреля 2017 г.

Errors should never pass silently.

PEP20: The Zen of Python