Files
autoreg-skills-max/skills/ai-provider-autoreg/references/email-forward-domain-pool.md

54 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Свой домен как почтовый пул: 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)
1. **Регистрация**: Gmail +alias на app.improvmx.com/signup → письмо «Confirm your ImprovMX email address» → validate-link.
2. **Активация аккаунта (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 обязательны.
3. **Домен + catch-all**: Add Domain → DNS MX уже должны смотреть на ImprovMX (для nodeloc-доменов ставятся через DNS API, см. выше) → Setup показывает Active/MX valid → catch-all `* → <gmail>`. Логи домена показывают DELIVERED с временем — сверять с таймлайном скрипта при «код не пришёл».
4. **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 (логин без капчи).
5. **Catch-all цель — голый Gmail БЕЗ `+alias`**: forward на `+alias`-адрес усиливает Gmail-фильтрацию (DMARC misalignment + alias-категоризация) — письма уходят в category-папки и могут blackhole'иться. Логи ImprovMX при этом показывают DELIVERED, а IMAP-поиск по INBOX пуст.
6. Письма в 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 (правила)
1. **НЕ хардкодить список ящиков (INBOX + Spam)** — forward-письма прилетают в произвольные Gmail category-папки с UTF-7-именами (`[Gmail]/&BBIEMAQ2BD0EPgQ1-` = Invoices, `[Gmail]/&BCEEPwQwBDw-` = Spam). Рабочий паттерн: `m.list()` → распарсить все mailbox-имена → стартовать с INBOX и Spam, затем обойти все остальные. Жёсткий двух-ящик-луп молча теряет коды, которые «доставлены» по логам forward-провайдера.
2. Критерий поиска пер-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-поиск по уникальной строке тестового письма.
3. Код извлекать `\b(\d{6})\b` из декодированного тела; verify-link — `https://\S*verify\S*`.
4. Timeout поллинга ≥400с: forward-доставка запаздывает на минуты (live: скрипт сдался на 300с, письмо пришло через 45с после).
5. `imaplib.search` критерий всегда в скобках с кавычками: `(TO "alias@gmail.com")`.
6. Диагностика «forward не работает»: ImprovMX `/domains/<d>/logs` — DELIVERED там + пусто в Gmail = проблема на стороне Gmail (category/blackhole), не forward'а; чинить сменой catch-all цели на голый адрес и перебором всех labels, а не перенастройкой MX.
## Экономическая проверка перед bulk
После ПЕРВОГО полного цикла (signup → код → onboarding → ключ/доступ) убедиться, что акк реально создан и домен принят onboarding'ом — успех OTP ещё не означает успех регистрации (allow-list может стоять ПОСЛЕ верификации). Только затем масштабировать local-part'ы.