RINDA 발신 도메인 제거 — 영향 분석 & 안전 조치 런북

send.grinda.ai · mail.rinda.ai · *.rinda.ai 제거 시 답장(reply) 파이프라인 영향과 단계별 안전 제거 절차

beta DB 실측 · 2026-06-22 집계 구간 최근 90일 개인용 · noindex

0핵심 요약

답장 연결은 도메인 문자열이 아니라 message_id 기반 매칭(Tier T1→T2→T4)이다. 그러나 답장이 물리적으로 도착하는 것은 도메인 MX에 100% 의존한다 — 도메인/MX 제거는 발송 중단·답장 영구 소실·워크스페이스 귀속 실패를 동시에 일으킨다.

가장 위험한 사실: 답장 inbound의 93%(13,213건/90일)가 SES rinda 서브도메인 계정으로 귀속되며, 이들은 자체 SES 수신이 아니라 도메인 MX → SendGrid Inbound Parse 경로로 들어온다. 즉 거의 모든 답장이 SendGrid Inbound Parse 하나로 수렴한다.
지표 (90일)의미
SES 계정 inbound13,213전체 답장의 93% — rinda 도메인
SendGrid 계정 inbound657send.grinda.ai
Unipile(gmail) inbound338개인계정·별도 webhook
inbound → email_replies 연결률23.3%나머지는 bounce·자동응답·뉴스레터
workspace 자체 등록 도메인1sperone.co.kr(failed) — 사실상 0

→ 모든 워크스페이스가 Rinda 공용 도메인 풀에 의존. 답장 자산이 소수 rinda 도메인에 집중.

1답장 수신 5경로 (provider별 메커니즘이 다름)

경로providerinbound/90일물리 수신 의존email_replies
MX→SendGrid Inbound Parse → /api/webhook/inboundses (rinda 도메인)13,213그 도메인 MX
동일 경로sendgrid657send.grinda.ai MX
SES Receipt→S3→polling worker (백업채널)고객 자체 SES~0SES Receipt Rule
/api/v1/unipile/webhookunipile (gmail)338Unipile 폴링
/api/v1/nylas/webhooksnylas (gmail OAuth)1Nylas 구독❌ repliedAt만
발송 시 Message-ID는 발신 도메인과 무관: SES는 @ap-northeast-2.amazonses.com(750,406건), SendGrid는 @send.grinda.ai(63,002), gmail은 @mail.gmail.com(57,101). 답장의 In-Reply-To가 이 값을 echo → 도메인 문자열을 비교하지 않으므로 from 도메인을 바꿔도 매칭 로직 자체는 안 깨진다. 깨지는 지점은 ① 물리 수신(MX) ② to_emailuser_email_accounts 워크스페이스 귀속 두 곳뿐.

2시퀀스 다이어그램

RINDA 답장 수신·매칭 파이프라인 시퀀스 다이어그램
답장 수신·매칭 파이프라인 — provider별 5경로 + 도메인 의존 (PlantUML)

3도메인 제거 영향 (심각도순)

제거 대상심각도발송 영향답장 영향
send.grinda.ai치명56.4만건/90일 발신 즉시 중단 (SendGrid 19 + SES 4 계정)5,999건/90일 + 과거 발송분 답장 전면·영구 차단
mail.rinda.ai치명45계정 발신 중단1,695건/90일 차단
chat / ask / intro …rinda.ai높음각 SES 계정 발신 중단각 100~2,796건 차단 (chat 큼)
gmail/outlook (unipile 252계정)없음영향 없음영향 없음 — 자체 도메인·별도 webhook

도메인별 발송 / 답장 자산 (90일)

도메인발송답장수신답장대기보유 replies
send.grinda.ai564,1185,999534,9901,594
chat.rinda.ai51,0172,79637,546331
mail.rinda.ai44,6111,69536,512479
gmail.com (unipile)32,1462676,8001,429
intro / ask / hello …3.9k~20k100~512다수60~123

4안전 조치 런북 (도메인 단위 단계별 제거)

한쪽만 내리면 더 위험하다(아래 함정). 반드시 순서대로, 각 단계 검증 후 다음으로.

  1. 사전 측정 — 잔량·활성 계정 확인 제거 대상 도메인의 활성 발신 계정과 미해결(답장 대기) 스레드를 먼저 센다. 0에 수렴할 때까지 다음 단계 보류.
    -- 활성 발신 계정
    SELECT email_address, provider, status FROM user_email_accounts
    WHERE email_address ILIKE '%@chat.rinda.ai' AND status='active';
    
    -- 최근 30일 발송 중 답장 대기(미해결)
    SELECT count(*) FROM emails
    WHERE direction='outbound' AND from_email ILIKE '%@chat.rinda.ai'
      AND status='delivered' AND replied_at IS NULL
      AND sent_at >= now()-interval '30 days';
  2. 신규 발송만 차단 (수신은 유지) 계정을 삭제하지 말고 status='inactive'로. 발송은 멈추되 to_email 매칭은 살아 있어 잔여 답장이 계속 귀속된다.
    UPDATE user_email_accounts SET status='inactive', updated_at=now()
    WHERE email_address ILIKE '%@chat.rinda.ai' AND status='active';
  3. 계정 마이그레이션 (필요 시) 해당 도메인에 묶인 활성 시퀀스가 있으면 발신 계정을 유지 도메인(예 mail.rinda.ai)으로 이전하거나 시퀀스를 다른 계정으로 재배정. 새 발송분 Message-ID가 유지 도메인으로 생성되도록 한다.
  4. 답장 유예 — MX 유지한 채 대기 MX·DNS는 그대로 두고 최소 30일(매칭 T4 fallback 윈도우와 동일) 유예. 이 기간 잔여 답장이 SendGrid Inbound Parse로 계속 회수된다. P1의 대기 카운트가 충분히 소진됐는지 재확인.
  5. 최종 제거 (역순 정리) ① Cloudflare에서 해당 도메인 MX·인증(DKIM/SPF) 레코드 삭제 → ② SendGrid Inbound Parse 호스트 해제 → ③ user_email_accounts soft delete → ④ workspace_sending_domains가 있으면 deleted_at 세팅.
    롤백: 각 단계는 역으로 되돌릴 수 있으나, P5 이후 도착한 답장은 복구 불가(NDR 반송됨). P5는 P4 검증 완료 후에만.

5부분 제거의 함정 (overfitting 주의)

① 발신 계정만 삭제 + MX 유지 → 답장은 도착하지만 to_emailuser_email_accounts 매칭 실패 → isReply=false조용히 폐기(로그만 남음).
② MX만 제거 + 계정 유지 → SendGrid가 NDR 반송, 앱은 답장이 온 줄도 모름.
③ enforce 플래그 함정SENDGRID_INBOUND_WEBHOOK_SECRET가 빈 값인데 SENDGRID_INBOUND_WEBHOOK_ENFORCE=true로 켜면 fail-closed로 전 도메인 답장이 401 차단된다. secret 설정 확인 후에만 flip. (config.ts:197–205)
안전 제거 핵심: 발신 차단(status) → 답장 유예(MX 유지) → 최종 제거의 순서를 지키고, gmail/outlook(unipile 252계정)은 자체 도메인이라 건드리지 않는다.