Как блокировать одноразовую почту при регистрации
Три способа ловить временные адреса в форме регистрации — от статического списка до API, с кодом, — и ошибки, из-за которых блокируются настоящие пользователи.
Что считается одноразовой почтой
Одноразовый (или временный) адрес выдаёт сервис, который даёт ящики без регистрации, обычно на минуты или часы. Так работают Mailinator, Guerrilla Mail, 10 Minute Mail и тысячи менее известных доменов. Они удобны, чтобы не получать рассылки, — и так же удобны тем, кто создаёт много аккаунтов.
С ними часто путают три соседние категории, которые требуют другого подхода:
- Приватные релеи —
privaterelay.appleid.comот «Вход с Apple»,duck.comот DuckDuckGo или Firefox Relay — пересылают письма в настоящий постоянный ящик. Блокируя их, вы бьёте по клиентам, ценящим приватность. Считайте их максимум слабым сигналом риска. - Бесплатные почтовые сервисы — Gmail, Outlook.com, Yahoo — не одноразовые. У них другая схема злоупотреблений: алиасы одного ящика, о них — в нашем руководстве по алиасам Gmail.
- Домены, которые вообще не принимают почту, — опечатки вроде
gmial.comили выдуманные домены. Их тоже стоит ловить: подтвердить там аккаунт невозможно.
Вариант 1: статический список в коде
На GitHub поддерживаются открытые списки одноразовых доменов на десятки тысяч записей. Проще всего загрузить один в множество и проверять домен при регистрации:
# Python DISPOSABLE = set(open("disposable_domains.txt").read().split()) def is_disposable(email: str) -> bool: domain = email.rsplit("@", 1)[-1].strip().lower().rstrip(".") parts = domain.split(".") # и поддомены тоже: mail.tempdomain.com -> tempdomain.com return any(".".join(parts[i:]) in DISPOSABLE for i in range(len(parts) - 1))
Это ничего не стоит и не добавляет задержки. Минусы:
- Список устаревает. Новые одноразовые домены появляются постоянно, и многие сервисы меняют домены именно для обхода списков. Список полугодовой давности не знает самых новых — а именно ими и пользуются нарушители.
- Списки расходятся. В разных списках разные домены, в некоторых есть ошибки. Объединение нескольких даёт лучшее покрытие, но требует больше поддержки.
- Нужна задача обновления и деплой (или перезагрузка) при каждом изменении.
Вариант 2: проверить почтовый сервер (MX)
DNS-запрос MX-записей домена показывает, может ли он принимать почту. Так ловятся опечатки и выдуманные домены, которых нет ни в одном списке:
# Python, с dnspython import dns.resolver def can_receive_mail(domain: str) -> bool: try: return len(dns.resolver.resolve(domain, "MX", lifetime=2)) > 0 except dns.resolver.NXDOMAIN: return False except Exception: return True # проблемы DNS — не вина пользователя: пропускаем
Кэшируйте результат по домену, держите таймаут коротким и никогда не отказывайте в регистрации из-за того, что у вашего DNS-резолвера был неудачный момент. Учтите: проверка MX не ловит одноразовые сервисы — они прекрасно принимают почту, это их работа.
Вариант 3: API, которое делает и то и другое и само обновляется
API выносит из вашего кода поддержку списка и MX-запросы. Attrelix объединяет несколько публичных списков, обновляет их ежедневно, хранит дату первого появления каждого домена, проверяет почтовый сервер и нормализует алиасы Gmail в одном вызове — а ещё оценивает сеть и устройство, так что вы получаете одно решение на регистрацию, а не только вердикт по почте. Поиск по домену можно бесплатно попробовать в проверке одноразовой почты.
curl https://attrelix.com/v1/check \ -H "Authorization: Bearer $ATTRELIX_SECRET" \ -H "Content-Type: application/json" \ -d '{"email":"someone@mailinator.com","ip":"203.0.113.9"}'
В ответе есть email.disposable, email.relay, email.mx и нормализованный адрес, а также общее решение и его причины.
Ошибки, из-за которых блокируются настоящие пользователи
- Блокировка релеев. Приватным релеем Apple пользуются многие владельцы iPhone, входящие через Apple. Заблокировав его, вы блокируете их.
- Блокировка при ошибках DNS. Таймаут не доказывает, что домен фальшивый.
- Слишком широкие списки. Некоторые общественные списки включают небольших легальных провайдеров или корпоративные домены. Если клиент жалуется, добавьте домен в разрешённые, а не спорьте.
- Сообщение об ошибке без выхода. «Неверный e-mail» сбивает с толку живого человека, который ввёл настоящий адрес. Объясните, что временные ящики не принимаются, и попросите другой адрес.
Чего не поймает проверка одноразовых адресов
Блокировка одноразовых доменов немного повышает цену злоупотребления: нарушитель переходит на Gmail. Дальше злоупотребление проявляется как много аккаунтов за одним ящиком или устройством. Здесь в дело вступает поиск мультиаккаунтов.
Итог
- Различайте одноразовые домены, приватные релеи, бесплатные сервисы и мёртвые домены.
- Статический список — хорошее начало, но он устаревает; обновляйте его или используйте API.
- Используйте MX для мёртвых доменов и пропускайте при проблемах DNS.
- Ожидайте, что нарушители перейдут на алиасы Gmail, и нормализуйте адреса.