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

10 KiB
Raw Blame History

Свой домен как почтовый пул: 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'ы.