API accepted나 SMTP remote accepted를 사용자의 inbox 도착으로 말할 수는 없습니다. 도메인별 queue·재시도·bounce·complaint를 분리해 확인 가능한 상태만 표시합니다.
운영자 직접 작성·기술 검토·최종 검토 2026.08.29
개념 이해전송 경로인증·평판장애 대응진도 저장
✉30초 핵심 요약
API accepted, SMTP remote accepted, bounce·complaint, mailbox placement를 별도 상태로 둡니다. 4xx는 domain별 backoff, 5xx·complaint는 suppression에 반영하고 확인하지 못한 inbox 도착은 보장하지 않습니다.
요청 경계Idempotency + outbox
전송 경계Domain queue + MTA
결과 경계Accepted ≠ inbox
DESIGN DECISION · 설계 판단
SMTP 수락 이후 어디까지를 전달 성공이라고 말할 수 있는가?
예시 이메일 요청600만/day
설계 가정
예시 피크 job약 1,670/s
계산 결과
예시 MIME 원본230GB/day
계산 결과
최종 선택
recipient state + domain queue + verified MTA feedback
API accepted, 원격 MTA accepted, bounce·complaint를 수신자별 상태로 나눕니다. domain queue에서 4xx backoff와 rate control을 적용하고 검증된 feedback을 suppression에 반영합니다.
선택 이유
SMTP 250을 받은편지함 도착으로 과장하지 않습니다.
특정 domain 장애와 평판 문제를 다른 발송에서 격리합니다.
bounce·complaint·unsubscribe 뒤 재발송을 빠르게 차단합니다.
포기한 대안
API 요청 안에서 SMTP를 동기 호출하고 성공으로 종료
외부 timeout이 업무 latency에 결합되고 이후 bounce·complaint와 domain별 retry 상태를 추적하기 어렵습니다.
감수한 단점
domain별 queue·rate·IP reputation 운영이 필요합니다.
SMTP timeout 뒤 중복 가능성을 완전히 제거할 수 없습니다.
MIME·첨부·feedback 보존이 storage와 보안 비용을 늘립니다.
01 · REQUIREMENTS
보냈다는 말을 단계별 상태로 나눈다
# 요구사항
SMTP의 원격 수락, inbox placement, 열람은 같은 신호가 아닙니다. 이 설계는 transaction·marketing 목적과 수신자별 결과를 먼저 모델링하고, 발신 서비스에는 SMTP credential과 retry 정책을 숨깁니다.
R1멱등 수락
tenant + Idempotency-Key로 재시도 요청은 같은 message를 재사용합니다.
R2수신자별 상태
fan-out 뒤 queue·attempt·bounce를 recipient 단위로 기록합니다.
R3정책 분리
suppression, unsubscribe, domain rate, abuse 검사를 전송 직전에 적용합니다.
R4감사 가능한 결과
API accepted, SMTP accepted, deferred, bounced, complained를 합치지 않습니다.
02 · HIGH-LEVEL DESIGN
메시지, 수신자, transport feedback을 분리한다
# 아키텍처
outbox는 API 수락과 전송 작업 발행의 틈을 줄입니다. composer는 변경되지 않는 MIME 원본을 만들고, domain queue와 MTA pool은 원격 도메인의 실패·속도·평판을 다른 tenant와 격리합니다.
이메일 제출부터 feedback까지의 독립 경로 SVG DIAGRAM · message / recipient / MTA / DSN
중요: SMTP timeout 뒤 원격 MTA가 실제로 받았을 수 있습니다. 따라서 queue의 at-least-once 재처리는 허용하되 새 message를 만들지 않고, message·recipient·attempt ID와 retry budget으로 중복 위험을 줄입니다.
03 · SUBMISSION / DELIVERY FLOW
수락, 조립, 전송, 피드백을 순서대로 남긴다
# 요청 흐름
첨부를 포함한 이메일의 raw MIME은 재시도 중에 조용히 바뀌지 않아야 합니다. 수신자별 job이 도메인 정책·suppression을 다시 확인하고, MTA의 응답과 DSN을 event로 추가합니다.
1Accept + outbox
API가 identity, template, 멱등 키를 검증해 message와 outbox를 함께 기록합니다.