10 KiB
Свой домен как почтовый пул: catch-all forward (ImprovMX / Namecheap eforward)
Для таргетов с work-email allow-list (daytona.io, attio, класс «validated work email»): единственный масштабируемый путь — рандомные local-part'ы на НАСТОЯЩЕМ домене с catch-all forward'ом в один Gmail, коды читать через IMAP.
Выбор домена — ПЕРВЫЙ шаг
- Free-сабдомены — НЕ годятся: таргеты с домен-валидацией на onboarding режут blocklist'ом свободных доменов даже после успешного OTP. Проверено на двух TLD (Daytona):
*.loc.ccи*.nl8.eu(nodeloc free) — оба прошли полный код-флоу, но финальный onboarding отверг домен («validated work email»). Не перебирать free-TLD в надежде найти непроверенный — для work-email-гейта нужен реальный зарегистрированный домен ИЛИ сабдомен из «developer»-реестра, чистого в blocklist'ах (is-a.dev— см.isadev-github-pr-domain-farm.md). - OAuth-обход домен-гейта не работает: у WorkOS-таргетов (Daytona) GitHub-коннекшен отдаёт
idp_access_deniedнезависимо от почтового домена GitHub-акка (проверено gmail/outlook/hotmail/t-online). Email+код на чистом домене — единственный путь. - Настоящий зарегистрированный домен (Namecheap и т.п.) — годится. Проверить до покупки/использования:
nslookup -type=MX <domain>и тестовое письмо. - Для nodeloc-домена MX/SPF на ImprovMX ставятся через DNS API (
POST /api/dns/{domain_id}/records: mx1/mx2.improvmx.com pri 10/20 +v=spf1 include:spf.improvmx.com ~all); домен становится Active в ImprovMX после пропагации (~20с).
Вариант A: ImprovMX (быстро, $0)
- Регистрация: Gmail +alias на app.improvmx.com/signup → письмо «Confirm your ImprovMX email address» → validate-link.
- Активация аккаунта (turnstile): страница validate содержит Cloudflare Turnstile (sitekey публичный, в UI-запросе валидации его нет — он уходит отдельным полем). Браузерная инъекция токена НЕ проходит (React-стейт). Рабочий путь:
- решить токен локальным sidecar'ом (
http://127.0.0.1:8877/solve, см.local-captcha-solver-sidecar.md); - прямой POST на API валидации:
POST https://api.improvmx.com/v3/account/validate/<id>c JSON{accept, newsletter, company_name, country}+ полеturnstile_challenge: <свежий токен> →success:true. Токен одноразовый/короткоживущий — решать прямо перед POST. - Заголовки Origin/Referer со страницы validate обязательны.
- решить токен локальным sidecar'ом (
- Домен + catch-all: Add Domain → DNS MX уже должны смотреть на ImprovMX (для nodeloc-доменов ставятся через DNS API, см. выше) → Setup показывает Active/MX valid → catch-all
* → <gmail>. Логи домена показывают DELIVERED с временем — сверять с таймлайном скрипта при «код не пришёл». - Free-план = 1 домен: чтобы добавить новый, старый удалять.
fetch DELETE https://api.improvmx.com/v3/domains/<domain>со страницы домена блокируется CORS — удаление только через UI:/domains/<domain>/settings→Delete domain→ подтверждениеDelete. Аккаунт-сессия протухает между вызовами browser_exec — при «Session Expired» просто повторить fill email+password (логин без капчи). - Catch-all цель — голый Gmail БЕЗ
+alias: forward на+alias-адрес усиливает Gmail-фильтрацию (DMARC misalignment + alias-категоризация) — письма уходят в category-папки и могут blackhole'иться. Логи ImprovMX при этом показывают DELIVERED, а IMAP-поиск по INBOX пуст. - Письма в Gmail падают в Spam ИЛИ произвольную category-папку (live: код WorkOS прилетел в
[Gmail]/&BBIEMAQ2BD0EPgQ1-= Gmail «Invoices» category, не в Spam) — см. правила IMAP-поллинга ниже.
Вариант B: Namecheap eforward (для доменов на Namecheap)
- MX
eforward*.registrar-servers.comуже стоит, но БЕЗ настроенных правил письма молча дропаются (bounce «Relay access denied» / relay denied). - API недоступен обычным аккаунтам (критерии: баланс $50+ / 20+ доменов / покупки $50+ за 2 года) —
getEmailForwardingвернёт «API Key is invalid or API access has not been enabled». Только UI. - UI-флоу: Domain Control Panel → overview → секция Email Forwarding → Add Forwarder (или Add Catch-All): поля
input[name="alias0"]=*,input[name="fwdto0"]= целевой gmail → Save Changes. Секция рендерится лениво/через раз — если кнопок нет в DOM, перезагрузить страницу и ждать 10-15с; fill_input может не видеть поля — использовать native value setter + dispatchEvent('input'/'change'). - Сессия протухает за ~2ч; 2FA-код на почту одноразовый и короткоживущий — логин-хелпер с ожиданием кода (
tmp/_nc_wait.py-паттерн: логин → 2FA-страница → поллинг файла с кодом) запускать заранее, код просить у юзера немедленно. Cookies сохранять в storage-state JSON и реинжектить черезNetwork.setCookies(без httpOnly-фильтрации проблем нет). - Проверка: SMTP-тест
probe<N>@<domain>с Gmail → IMAP-поиск (INBOX + Spam) по SUBJECT; bounce от mailer-daemon = forward не настроен.
Вариант C: forwardemail.net (DNS-only, безлимитный — для масс-фарма доменов)
ImprovMX free = 1 домен на аккаунт; когда доменов десятки/сотни (is-a.dev PR-фарм), единственный масштабируемый путь — forwardemail.net free-план: forward настраивается ЧИСТО DNS-записями домена, без регистрации и без добавления домена в аккаунт:
- MX:
mx1.forwardemail.net,mx2.forwardemail.net - TXT:
forward-email=<целевой gmail>(catch-all; можно*=alias@gmail.com) - TXT:
v=spf1 include:spf.forwardemail.net ~all
Правила ImprovMX про голый Gmail без +alias и про category-папки Gmail (см. ниже IMAP-поллинг) применимы и здесь — приёмная сторона та же. Для пула доменов эти записи зашиваются прямо в PR/zone-файл при регистрации домена.
IMAP-поллинг кодов через forward (правила)
- НЕ хардкодить список ящиков (INBOX + Spam) — forward-письма прилетают в произвольные Gmail category-папки с UTF-7-именами (
[Gmail]/&BBIEMAQ2BD0EPgQ1-= Invoices,[Gmail]/&BCEEPwQwBDw-= Spam). Рабочий паттерн:m.list()→ распарсить все mailbox-имена → стартовать с INBOX и Spam, затем обойти все остальные. Жёсткий двух-ящик-луп молча теряет коды, которые «доставлены» по логам forward-провайдера. - Критерий поиска пер-box'овый:
select(box)→search(None, '(FROM "workos-mail.com")')(или нужный отправитель) → fetch свежих → матчить local-part по заголовкамTo/Delivered-To/X-Original-To. ID писем между mailbox'ами НЕ переносимы — каждый box отдельно. При промахе всех критериев — широкий fallback:HEADER Delivered-To/HEADER X-Original-To/ body-поиск по уникальной строке тестового письма. - Код извлекать
\b(\d{6})\bиз декодированного тела; verify-link —https://\S*verify\S*. - Timeout поллинга ≥400с: forward-доставка запаздывает на минуты (live: скрипт сдался на 300с, письмо пришло через 45с после).
imaplib.searchкритерий всегда в скобках с кавычками:(TO "alias@gmail.com").- Диагностика «forward не работает»: ImprovMX
/domains/<d>/logs— DELIVERED там + пусто в Gmail = проблема на стороне Gmail (category/blackhole), не forward'а; чинить сменой catch-all цели на голый адрес и перебором всех labels, а не перенастройкой MX.
Экономическая проверка перед bulk
После ПЕРВОГО полного цикла (signup → код → onboarding → ключ/доступ) убедиться, что акк реально создан и домен принят onboarding'ом — успех OTP ещё не означает успех регистрации (allow-list может стоять ПОСЛЕ верификации). Только затем масштабировать local-part'ы.