---
title: Как написать SPF политику
description: Узнайте, как правильно написать/настроить SPF политику для отправки электронных писем от имени вашего домена
navigation: true

badges:
  - value: Домены
    to: /domains
    target: _self
    icon: lucide:globe
  - value: DNS
    to: /domains/dns
    target: _self
    icon: lucide:pencil-line

authors:
  - name: Sherali Salomidinov
    username: coderplusdesigner
---

Каждая SPF-запись должна начинаться с v=spf1, затем последовательность механизмов (слева → направо), затем при необходимости модификаторы; проверка останавливается на первом совпадающем механизме, и итоговое действие обычно определяется механизмом all (-all, ~all, ?all).

## Общая структура (порядок важен)
```txt
v=spf1  <mechanism> <mechanism> <mechanism>  [modifier] 
```

## Каждый механизм может иметь префикс квалификатора:

* \+ : Pass (по умолчанию, если опущено) — принять.
* \- : Fail (жёсткий отказ) — отклонить/запретить.
* ~ : SoftFail — принять, но пометить как подозрительное.
* ? : Neutral — нет политики.

Примеры: *-all*, *~mx*, *?include:example.uz*.

## 1. Начало: версия (обязательно)
Любая SPF-запись всегда начинается с:

```txt
v=spf1
```

Это сообщает получателям: «это SPF версия 1». Если отсутствует — запись недействительна.

## 2. Механизмы — строительные блоки (синтаксис, назначение, поведение DNS-запросов)

### ip4:<ip4[/cidr]>
  * Пример: ip4:203.0.113.5 или ip4:203.0.113.0/24.
  * Проверяет, входит ли подключающийся IPv4 в эту сеть. Если с IP 203.0.113.5 отправляется письмо от you@example.uz — оно принимается.
  * Не выполняет DNS-запросы (не учитывается в лимите 10).

Пример:  
```txt
v=spf1 ip4:203.0.113.5 -all
```

### ip6:<ip6[/cidr]>
* То же самое, но для IPv6. DNS-запросы не делает.

Пример:  
```txt
ip6:2001:db8::/32
```

### a или a:<домен>
* Пример: `a` или `a:mail.example.uz` (можно с CIDR).
* Разрешает A/AAAA записи домена и сравнивает IP отправителя.
* Лучше указывать адрес почтового сервера, например `mail.example.uz`.
* Выполняет DNS-запросы (учитывается в лимите). Используйте ip4/ip6, если возможно.

Пример:  
```txt
a:example.uz
```  
или просто `a` (проверяет A/AAAA записи зоны).

### mx или mx:<домен>
* Пример: `mx` или `mx:example.uz`.
* Проверяет MX записи, затем их A/AAAA. Совпадение = разрешено.
* Лучше указывать корневой домен (`example.uz`).  
* Выполняет DNS-запросы.

### include:<домен>
* Пример: `include:_spf.google.com`.
* Подтягивает SPF указанного домена. Если тот даёт Pass — совпадение.
* Делает DNS-запросы, может раскрыться в дополнительные (считается в лимит 10). Избегайте лишних include.

### exists:<домен>
* Пример: `exists:%{i}._spf.example.uz` (поддерживает макросы).
* Проверяет, существует ли A запись для домена. Считается в лимит.

### all
* Совпадает со всеми. Обычно в конце с квалификатором:
  * -all = жёсткий отказ (всё остальное отклонить).
  * ~all = мягкий отказ (принять, но пометить).
  * ?all = нейтрально (нет политики).
* DNS-запросы не выполняет. Использовать осторожно.

## 3. Модификаторы

### redirect=<домен>
* Передаёт проверку SPF другому домену, если ничего не совпало.  
* Работает только после механизмов.  
* Если есть `all` — redirect не применяется.

### exp=<домен>
* Возвращает человекочитаемое объяснение при FAIL.  
* Запрос exp выполняется после проверки и не учитывается в лимите 10.

## Жёсткое правило: лимит 10 DNS-запросов
SPF ограничивает механизмы/модификаторы, требующие DNS-запросов, до 10. Если больше — PermError (ошибка SPF).  
Считаются: include, a, mx, ptr, exists, redirect.  
Не считаются: ip4, ip6, all, exp.

## Алгоритм проверки
1. Сервер получает TXT для example.uz.
2. Парсит SPF строку (должна быть одна).
3. Проверяет механизмы слева → направо.
4. Если совпало — возвращает результат (PASS/FAIL/...).  
5. Если нет и есть redirect → проверяет его.  
6. Если нет redirect → ?all (нейтрально).  
7. Если более 10 запросов → PermError.

## Практические примеры

### Запретить всё (базовый вариант)
```txt
v=spf1 -all
```

### Один сервер (IP)
```txt
v=spf1 ip4:203.0.113.5 -all
```

### Сервер использует A/MX и Google Workspace
```txt
v=spf1 a mx include:_spf.google.com -all
```

### Несколько сторонних сервисов
```txt
v=spf1 include:_spf.google.com include:spf.sendgrid.net include:mailgun.org -all
```

### Тестовый режим (мягкий отказ)
  ```txt
v=spf1 ip4:203.0.113.5 ~all
```

## Типичные ошибки

* Более 10 запросов → PermError. Решение: уменьшить include, заменить a/mx на ip4/ip6.  
* Несколько SPF TXT → запись недействительна.  
* +all или отсутствие all → позволяет спуфинг.  
* ptr → медленно, ненадёжно. Избегайте.  
* Не согласовано с DMARC → SPF может пройти, но DMARC упадёт. Всегда используйте DKIM+SPF+DMARC.

## Дополнительно
* redirect= полезен для множества поддоменов.  
* exp= редко используется, но может пояснить причину FAIL.

## Чек-лист
* Одна TXT строка с v=spf1.  
* Только реальные IP/хосты.  
* Подсчитайте запросы ≤ 10.  
* Начинайте с ~all, затем переходите на -all.  
* Используйте DKIM + DMARC.


---

**Source URL:** https://support.hostmaster.uz/ru/domains/dns/how-to-write-spf-policy
