Rinda 이메일 스팸 배치 테스트 — 실행 계획

S01–S12 가설 검증 · 수신자 10명 · AWS SES v2 발송 자동화 스크립트

생성 2026-06-28 KST 발송 12통 (가설당 1통 · 라운드로빈) 출처 email_spam_test_s01_s12_settings.md

1목표 & 가설

동일 발송 조건에서 콘텐츠 변수만 단계적으로 증가시켜(S01=순수 텍스트 → S12=원본 마케팅 메일 전체), 어느 지점에서 인박스→스팸 전환이 일어나는지 격리 측정한다. S01이 스팸이면 발신자/도메인/평판 문제, 특정 단계에서 갈리면 그 변수(HTML·서명·로고·링크·구독해지)가 원인.

코드가설(검증 변수)From name포맷Unsub
S01순수 1:1 평문 (서명·HTML·링크·구독해지 없음) = 최저 위험 기준선textno
S02HTML 포맷 자체의 영향text+HTMLno
S03발신자 이름(박준영) 추가박준영text+HTMLno
S04회사/서비스명 언급박준영text+HTMLno
S05"해외 영업 자동화" 제품 카테고리 추가박준영text+HTMLno
S06발신주소 일치 텍스트 서명 추가박준영text+HTMLno
S07서명 이메일 불일치(mail vs talk)박준영text+HTMLno
S08HTML 테이블 서명(로고 없음)박준영text+HTMLno
S09서명 로고 이미지(원격 S3)박준영text+HTMLno
S10본문 링크 + 플랜 문구박준영text+HTMLno
S11원본 마케팅 메일 전체 (고위험 대조군)rinda@talk…원본 text+HTMLyes
S12원본 + 가시적 수신목적 안내문rinda@talk…원본 + 안내문yes

2고정 발송 조건

발신 주소rinda@talk.rinda.ai (S03–S10 display name 박준영)
Provider / RegionAWS SES v2 / ap-northeast-2
Configuration setrinda-marketing
발송 매핑가설당 1통, 수신자 라운드로빈 — 총 12통 (r1·r2만 2통)
메시지 간 지연발송 간 20,000 ms (rate 조절)
메트릭 오염 가드DB 미기록 기본. 기록 시 sequence_id / step_id / lead_id = null
구독해지 헤더S01–S10 없음 / S11–S12 원본 List-Unsubscribe + List-Unsubscribe-Post
원본 소스emails.id = 019ed8b4-…-2277c4e8d09a (조회 완료 · text 1778B · html 5223B)

3수신자 → 가설 매핑 (10명 · 총 12통)

#수신자 (gmail)받는 가설
r1TitooGranillo371@gmail.comS01 + S11
r2WoodlockAndrian@gmail.comS02 + S12
r3BrittsanOrren@gmail.comS03
r4YasinskiSclafani@gmail.comS04
r5HappennyBrignac64@gmail.comS05
r6KaulitzJudit56@gmail.comS06
r7KumarRamprakash398@gmail.comS07
r8CoulonSimon638@gmail.comS08
r9LauraCupper542@gmail.comS09
r10TrudeKhan209@gmail.comS10

전부 gmail.com → Google 인박스/스팸 배치 일관 측정. 각 수신자가 거의 1통씩만 받으므로 "다발 수신" 오염을 회피(r1·r2만 2통, 20초 간격). 가설당 표본 1이라 placement는 정성 신호 — 반복 측정으로 보강 권장.

4인프라 검증 결과 ✅ 발송 가능

항목상태상세
도메인 identityVerifiedtalk.rinda.ai 검증됨 (이메일 단위 identity는 없으나 도메인이 커버)
DKIM활성RSA-2048 Easy DKIM · MAIL FROM bounces.talk.rinda.ai
계정 모드Productionsandbox 아님 · quota 200k/일 · 25/s (120건 여유)
Config set rinda-marketing존재SendingEnabled · ReputationMetrics on
Open/Click 추적활성redirect link.rinda.ai본문 링크·구독해지 URL이 rewrite됨 (테스트 변수)
AWS 자격profile grindaai코드 경로는 env AWS_SES_ACCESS_KEY_ID / _SECRET_ACCESS_KEY / _REGION

5코드 통합 방식

발송 함수기존 sendEmailViaSes 재사용 (elysia-server/src/services/ses-email.service.ts)
실행bun elysia-server/scripts/spam-test-s01-s12.ts (DRY-RUN 기본, --send 로 실발송)
From 형식"박준영 <rinda@talk.rinda.ai>" raw 문자열 (SES FromEmailAddress)
Config set 지정category:"marketing"rinda-marketing 자동 해석
List-Unsubscribe 원본형<https://app.rinda.ai/api/v1/unsubscribe?lid=…&token=…>, <mailto:unsubscribe@grinda.ai?subject=…>

본문 빌드 (md §Code-by-Code)

공유 텍스트블록(coffeeText·serviceText·automationText·planText·linkText) + 서명 6종 + textToHtml() 헬퍼로 S01–S10 조립. S11=원본 text/html 그대로, S12=원본 + 가시적 안내문을 border-top:1px solid #eee 구독해지 푸터 직전에 삽입(마커 1개 확인됨).

6실행 DAG

L0 조사 L1 빌드 L2 스크립트 L3 발송 ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │N0.0✓ SES검증 │══▶│N1.0 텍스트/서명│══▶│N2.0 variant │══▶│N3.0 DRY-RUN │ │N0.1✓ 코드패턴 │══▶│ 12종 빌더 │ │ 루프+20s delay│ │ 매트릭스 검토 │ └──────────────┘ │N1.1 원본 주입 │ │N2.1 unsub헤더 │ │N3.1 --send │ │ (S11/S12) │ │ S11/S12만 │ │ 실발송 │ └──────────────┘ └──────────────┘ └──────────────┘ ✓ 완료 대기 대기 게이트(승인 후)

7리스크 & 결정 필요

① Click tracking 활성. rinda-marketing config set이 본문 링크와 List-Unsubscribe URL을 link.rinda.ai로 rewrite한다. md는 이 config set 사용을 명시하므로 그대로 두지만, "추적 rewrite 자체가 스팸 요인인가"를 분리하려면 별도 무추적 set이 필요 — 현재는 md 충실히 따름.
② List-Unsubscribe 토큰 부재. 테스트는 lead_id=null이라 실제 unsubscribe 토큰을 생성할 수 없음. S11/S12 헤더는 mailto:unsubscribe@grinda.ai 폴백만 사용하거나 더미 token으로 구성 → 스크립트에서 mailto-only 채택 예정.
③ 표본 수 = 1. 가설당 1통이라 placement 결과는 정성 신호(통계 아님). 동일 매핑으로 며칠 반복하거나 수신자 풀을 늘려 가설당 N≥3으로 보강 권장. 총 12통은 20초 간격 ≈4분 내 완료.
④ 안전장치. 스크립트는 --send 없으면 발송 0건(콘솔에 매트릭스만 출력). 실발송 전 본 계획 승인 게이트.