2026-05-30 기준 12개 서비스 비교 RFC 5321 / 5322 자체구현 ROI 분석

이메일 검증 2026 — 시장 · 기술원리 · 자체구현

MillionVerifier · ZeroBounce · Bouncer 등 12개 서비스의 가격과 정확도, RFC 기반 8-layer 기술 원리, 그리고 "직접 만들 것인가 살 것인가" 의사결정까지 한 곳에서.

1. 한눈에 보기

TL;DR

  • 2026년 자체 SMTP probing은 사실상 죽었다. Gmail / Microsoft 365 / Yahoo / Apple / Proton이 모든 RCPT TO에 250을 던지거나 IP를 차단해서, 글로벌 메일 70%+가 SMTP-level 검증 불가능.
  • 가격 양극화 — 1M 건당 $399 (MyEmailVerifier) ↔ $2,750 (ZeroBounce). 7배 차이. 진짜 차이는 catch-all 처리 능력(B2B 리스트의 28~40%가 catch-all).
  • "99% 정확도" 마케팅은 catch-all을 risky로 회피하기 때문에 성립. 공개 벤치마크상 Gmail 정확도는 최고 툴도 70% 수준.
  • 월 발송량 < 10만 → 상용 단독. 10만~1000만 → 하이브리드(자체 L1-2 + 상용 L3). 1000만+ → 자체 + 상용 spam trap DB.
  • 린다(앱린다) 권고: 상용 API + Postgres 90일 캐시 + bounce webhook 학습 루프. 자체 SMTP probing 인프라는 ROI 마이너스.

3극 시장 구도

대표강점가격 (100K)
B2B catch-all 강자Bouncer · ZeroBounce Verify+Google Workspace / M365 deep verify, unknown 0.3~3%$349~$400
가격 최적화MillionVerifier · MyEmailVerifier · DeBounce1M 건당 $400~550, 평생 만료없는 PAYG$79~$129
엔터프라이즈 컴플라이언스BriteVerify · ZeroBounce · NeverBounceSOC2 Type 2 + ISO 27001 + Salesforce 네이티브$349~$600

2. 12개 서비스 프로파일

MillionVerifier 최저가

1K $3.70 · 100K $129 · 1M $549

본사 헝가리(EU) · 정확도 99% claim / 95.8% 실측 · 모델 만료없는 PAYG

✓ 업계 최저가, 100% 환불 보증, catch-all 미과금 (risky로만 표시)

✗ SOC2 미인증, 한글 UI 없음, catch-all을 결국 사용자가 직접 처리해야 함

ZeroBounce 컴플라이언스 1위

2K $20 · 100K $349 · 1M $2,250

본사 미국 · 정확도 99.6% / 96~98% 실측 · 모델 PAYG + ONE 월구독

✓ SOC2 Type 2 · ISO 27001 · HIPAA · PCI-DSS · GDPR · CCPA. 60+ ESP 통합, Email Scoring(AI), Inbox Placement

✗ 가격 비쌈, entry $10/1K, 99.6% 과장 마케팅

Bouncer Catch-all 1위

1K $8 · 100K $400 · 1M $2,000

본사 폴란드(EU) · 정확도 99.5% claim / 98.9% 실측 1위 (prospeo)

✓ Google Workspace · M365 deep verify로 unknown 0.3~3%, Toxicity Score 0~5, EU-only data residency, 4B+ 트랙레코드

✗ 미국 ESP 통합 적음, SOC2 진행중(아직 미완료)

NeverBounce ZoomInfo 산하

1K $8 · 100K $400 · 1M $2,000

본사 미국 · 정확도 99.9% / 93~97% 실측 · 모델 PAYG + 월구독

✓ ZoomInfo 번들로 ZI 사용자는 사실상 무료, 엔터프라이즈 안정성

✗ 인수 후 혁신 정체, PAYG/구독 가격 역전, 수동 review로 10분~2시간 지연 발생

Kickbox Sendex Score

500 $5 · 10K $80 · 100K $800

본사 미국 · 정확도 67~98% (벤치마크별 편차 큼)

✓ Sendex 0~1 점수로 segment 가능, HubSpot Marketplace 공식 앱

✗ catch-all 약함, 크레딧 12개월 만료, 가격 평범

Emailable 속도 1위

5K $30 · 100K $290 · 1M $1,490

본사 미국 · 10K 처리 2분 (0.012초/건) 업계 최고

✓ 속도 1위, Apple Pay / Google Pay 결제 (한국 카드 편의), 무료 250건, Inbox Placement 통합

✗ catch-all 평범, EU 호스팅 옵션 약함

Clearout

3K $21 · 100K $359 · 1M $2,500

본사 인도 · 정확도 98% claim / 98.1% 실측

✓ 가격 대비 정확도 좋음, Email Finder 통합 (4 credit/건)

✗ 인도 본사 (data residency 민감 시), catch-all 평범

Hunter.io Verify는 부업

Growth $149/mo (10K credit = 20K 검증)

본사 프랑스 · 정확도 95% claim / 70~96% 실측 편차

✓ Email Finder가 본업 (B2B prospecting 통합), Sheets add-on, Chrome ext

✗ 순수 검증 단가 비쌈 ($7.45/1K), catch-all 약함

BriteVerify 엔터프라이즈

5K $40 · 100K $600 · 1M+ 견적

본사 미국 (Validity 산하) · ISO 27001 / 27701

✓ Salesforce 네이티브 매니지드 패키지, phone + 우편주소 verification 동봉

✗ 비쌈, 크레딧 1년 만료, 셀프서비스 UX 약함

MyEmailVerifier 한국결제 1위

1K $2.5 · 100K $79 · 1M $399 (최저)

본사 인도 · 매일 100건 무료 영구 갱신

✓ 업계 최저가, Alipay·암호화폐·Amazon Pay 결제, AICPA 인증

✗ 3rd party 정확도 벤치마크 부족, API 초기 rate 30/min

Verifalia

Free 25/day · 구독 모델

본사 이탈리아 (독일 DC) · 품질 레벨 3단계 (Standard / High / Extreme)

✓ 속도-정확도 tradeoff 명시적, EU 데이터 주권, SDK 가장 풍부 (Go/Node/Python/.NET/Java)

✗ 일일 만료 크레딧, 기본 정확도 mid-tier (92~95%)

DeBounce EU 저가

5K $10 · 100K $90 · 1M $499

본사 에스토니아(EU) · 97.5%+ deliverability 보증

✓ 가격 매우 저렴 ($0.5/1K @1M), 명시적 보증, EU 호스팅, 별도 catch-all validator (10 credit)

✗ 브랜드 인지도 낮음, catch-all은 10x 크레딧

3. 가격 · 정확도 · Catch-All 비교표

3.1 1,000건당 가격 (PAYG 환산)

서비스1K10K100K1M실효 단가/1K
MyEmailVerifier 최저$2.5$15$79$399$0.40
DeBounce$4*$20$90$499$0.50
MillionVerifier$37$129$549$0.55
Hunter.io (구독 환산)$24.5$74.5$7.45
Emailable$6*$48$290$1,490$1.49
Clearout$7*$70$359$2,500$2.50
Bouncer$8$70$400$2,000$2.00
NeverBounce$8$80$400$2,000$2.00
BriteVerify$10*$80$600견적$4.50
Kickbox$10*$80$800견적$8.00
ZeroBounce$10$65$349$2,250$2.25

* 최소 묶음 단위 가격을 1K로 환산

3.2 Catch-All 도메인 처리 능력 — 진짜 차별점

등급서비스방식비고
SBouncerGoogle Workspace · M365 deep SMTP probingunknown 0.3~3%, 업계 1위
SZeroBounce Verify+추가 비용 multi-pass표준 모드는 lenient(B+급)
AVerifalia (Extreme)9× 크레딧, greylist retry시간 들이면 정확
ADeBounce catch-all validator10× 크레딧 옵션, server response 분석명시적 추가검증
BKickbox (Sendex) · Emailable0~1 또는 0~10 점수binary 아닌 segmentation
BNeverBounce · Huntercatchall status 명시 분류점수 없음
CMillionVerifier검증 안 함, 크레딧 환불사용자 결정에 위임
CClearout · BriteVerify · MyEmailVerifierrisky / greylisted 일괄 분류추가 점수 없음
왜 중요한가: B2B 리스트의 28~40%가 catch-all 도메인. 같은 99.5% 정확도라도 catch-all 처리 방식이 ROI를 가른다.

3.3 Unknown · Catch-all 비율 (2024~2025 벤치마크)

서비스Unknown %Catch-all %평가
Bouncer0.3~3%deep verify로 절반 resolution
ZeroBounce1.69%10.8% (Verify+ 사용 시 ↓)
MillionVerifier~0%*catch-all 전부 risky 분류운영상 0% (risky는 별도)
NeverBounce3~5%8%평균
Emailable4~6%12%평균
Hunter5~10%15~20%catch-all 약함

* MillionVerifier는 unknown을 청구하지 않는 정책 — 운영상 0%지만 실제 검증 못 한 것

3.4 처리 속도 / API throughput

서비스10K 처리 시간시간당 throughput
Emailable 1위2분~300K/h
MillionVerifier3분 24초~180K/h
ZeroBounce3분 36초~100~150K/h
Bouncer200K+/h (claim)
NeverBounce5~10분 (수동 review 시 +2h)100K/h
MyEmailVerifier<1시간 (100K)~100K/h

3.5 보안 · 컴플라이언스

서비스SOC2 T2ISO 27001GDPREU 호스팅리스트 정책
ZeroBounceEU 서버 옵션
BriteVerifypartner✓ (27001/27701)Validity Trust Center
Bouncer진행중EU-only검증 직후 폐기
Verifalia독일 DC자동 삭제
NeverBounce✓ (ZI)ZoomInfo Trust
DeBounceEU직후 폐기
Kickbox미국자체
Hunter프랑스자체

4. 검증 8-Layer 기술 원리

이메일 검증은 8개 레이어의 누적 신호(stacked signal) 시스템이다. 단일 레이어로 끝나지 않으며, 각 레이어의 confidence를 누적해 threshold 정책으로 결정한다.

Layer검증 항목단독 정확도비용거짓응답 위험
L1Syntax (RFC 5322)30~40%0낮음
L2DNS · MX (RFC 5321 §5.1)50~60%1 RTT낮음
L3SMTP probing (RCPT TO)70~85%3~5 RTT매우 높음
L4Catch-all 추론+5~10%2 RTTM365는 항상 catch-all 응답
L5Disposable 도메인+3~5%DB lookup동적 회피
L6Role-based+1~2%string match의미 분류
L7Spam-trap / Honeypot-∞ (필터)ML / DBpristine trap 탐지 불가
L8ML · 평판 score종합high학습 편향

L1. Syntax Validation — RFC 5321 vs 5322

RFC영역핵심 규정
RFC 5321 (SMTP)전송 envelopeMAIL FROM: RCPT TO:의 Mailbox. local part 64 octet, domain 255 octet, path 전체 256 octet
RFC 5322 (IMF)메시지 헤더From: To: display name, group syntax, CFWS
RFC 5598ArchitectureMUA / MSA / MTA / MDA 역할
RFC 6530~6533, 8616EAI · SMTPUTF8UTF-8 local part / domain, downgrade rules
중요: 5321(envelope)이 5322(header)보다 엄격하다. "a b c"@x.com은 5322는 허용하지만 5321 envelope에서는 거부하는 MTA가 다수.

Local part ABNF

local-part   = dot-atom / quoted-string / obs-local-part
dot-atom     = [CFWS] dot-atom-text [CFWS]
atext        = ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'"
             / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`"
             / "{" / "|" / "}" / "~"

따라서 다음도 syntax 적으로 valid:

weird!one#two$three%four&five'six*seven+eight-nine/ten=eleven?twelve^thirteen_fourteen`fifteen{sixteen|seventeen}eighteen~nineteen@example.com

"john..doe"@example.com              ← valid (5322), 일부 MTA 거부 (5321)
" "@example.com                      ← 공백만으로도 valid
用户@例子.中国                       ← IDN → xn--fsqu00a.xn--fiqs8s

왜 perfect regex가 불가능한가

RFC 5322 ABNF는 재귀적 nested comment((comment (nested)))와 obs-* productions를 포함한다. 정규언어(Chomsky type-3)는 재귀를 허용하지 않으므로 수학적으로 regex로 표현 불가능. 유명한 6,343자 짜리 "RFC 5322 regex"도 obsolete syntax/CFWS 일부를 빼먹는다.

// ❌ 잘못된 접근
const RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/

// ✓ 옳은 접근 - layered library
import { validate } from 'email-validator'    // syntax only, RFC 5321 envelope
import * as mailauth from 'mailauth'          // SPF/DKIM/DMARC/ARC verify
import { isEmail } from 'validator'           // { allow_utf8_local_part, require_tld }
라이브러리영역RFC 5322 quotedEAI UTF-8
validator.js isEmailsyntaxpartialopt-in
email-validator (npm)syntax+simple
mailauthSPF/DKIM/DMARC/ARCn/ayes
deep-email-validatorsyntax+DNS+SMTP+disposablepartialpartial
Python email-validator (JoshData)syntax+DNSyesyes

L2. DNS / MX Lookup

RFC 5321 §5.1 — MX 조회 절차

1. domain의 MX RR 조회
2. MX 있음 → preference 오름차순 정렬, 동일 pref는 random shuffle
3. MX 없음 → A/AAAA "implicit MX" (legacy fallback) 시도
4. A/AAAA도 없음 → 5.1.2 / 5.4.4 NDR

Null MX (RFC 7505)

example.com.  IN  MX  0  .

exchange. (zero-length label, root) → 이 도메인은 mail을 받지 않음. 클라이언트는 556 Server does not accept mail + 5.1.10으로 즉시 permfail. 검증 단에서 확정 invalid로 분류 가능.

DNS 캐싱 함정

  • NXDOMAIN을 negative cache(SOA minimum TTL)에 5분~24시간 stale.
  • BullMQ 워커에서 대량 verify 시 dig +nocookie +tries=1 또는 Unbound/CoreDNS 권장. Node dns.promises.resolveMx는 OS resolver 의존이라 캐시 동작이 불투명.
  • DNSSEC 적용 도메인은 AD flag로 인증된 NXDOMAIN/null MX 신뢰 가능.

L3. SMTP Probing — 핵심이자 가장 어려운 부분

정상 케이스 wire-level

$ telnet aspmx.l.google.com 25
220 mx.google.com ESMTP ...
EHLO verifier.example.com
250-mx.google.com at your service, [203.0.113.10]
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-PIPELINING
250-SMTPUTF8
250 CHUNKING
MAIL FROM:<probe@verifier.example.com>
250 2.1.0 OK
RCPT TO:<known.user@example.com>
250 2.1.5 OK
RCPT TO:<nonexistent-xyzqwerty@example.com>
550-5.1.1 The email account that you tried to reach does not exist.
QUIT
221 2.0.0 closing connection
핵심: DATA 명령을 보내지 않고 QUIT. RCPT TO 응답(250/550)만으로 mailbox 존재 여부 판정. 메일은 실제 발송 안 됨.

RCPT TO 응답 코드 의미

코드카테고리의미verifier 해석
250Successmailbox acceptedvalid (단, catch-all 가능성)
251Successuser not local, will forwardvalid (relay)
252Success(약함)cannot VRFY, but accept불확실 — M365 default
450Transientmailbox temp unavailablegreylist 의심
451Transientlocal error / greylistgreylist 의심
452Transientover quotaretry
550Permanentmailbox unavailableinvalid (or IP 차단)
553Permanentmailbox name not allowedinvalid (syntax 거부)
554Permanenttransaction failedinvalid 또는 IP 차단
556Permanentdomain does not accept mailNull MX (RFC 7505)

RCPT TO가 거짓말을 하는 5가지 메커니즘

(a) Catch-all / Accept-all

RCPT TO:<obviously-fake-zxcvbnm@catchall.com>
250 2.1.5 OK

도메인 owner가 *@catchall.com을 한 mailbox로 라우팅. 모든 주소에 250. Postfix smtpd_reject_unlisted_recipient = no가 대표.

(b) Greylisting (RFC 6647)

RCPT TO:<real.user@example.com>
451 4.7.1 Greylisted, try again later

처음 보는 (sender_ip, sender, recipient) 3-tuple에 4xx 던지고 재시도 기다림. Verifier가 한 번에 판정 못 함.

(c) Tarpitting

서버가 응답을 인위적으로 5~30초 delay → connection pool 고갈, throughput 폭락. Postfix smtpd_error_sleep_time이 대표.

(d) Anti-probe blocking

RCPT TO:<real.user@protected.com>
550 5.7.1 Verification probe denied

대규모 verifier IP 대역 (ZeroBounce, Hunter, Bouncer 등) IP/ASN 미리 차단. 정상 RCPT도 550.

(e) Sender domain reputation 영향

수신 MTA가 MAIL FROM: 도메인의 SPF/DKIM/DMARC를 확인한 뒤 결정. Verifier가 자체 도메인으로 EHLO 하면 reputation 낮아 550. 대형 verifier는 회전 sender domain pool + 각각 SPF/DKIM/DMARC + warm-up으로 우회.

Gmail / M365 / Yahoo의 차단 — 2026 안티-프로빙 현실

제공자검증 probe 동작회피 가능성
Gmail모든 RCPT 250 응답 (catch-all처럼 동작) + DATA에서 reject거의 불가능
Microsoft 365Recipient Filtering 기본 Anonymous restrictions → 250 통과, 실제 mailbox 검증 X불가능
Yahoo / AOL검증 IP 대역 광범위 차단, 421 timeout불가능
iCloudEHLO 직후 421 throttle / probe IP 차단불가능
ProtonMailRCPT 모두 250 (catch-all처럼 동작)불가능
충격적 사실: 글로벌 메일의 70%+ (Gmail/M365/Yahoo/Apple/Proton)가 SMTP-level 검증 불가능. 이 4개 제공자는 사실상 reputation·ML 추론(L8)으로만 점수화 가능.

L4. Catch-All Detection

Control probe 기법

1. RCPT TO:<target@domain.com>              → 250
2. RCPT TO:<random-abc123xyz-9182@domain.com> → 250  ← 동일 응답이면 catch-all
                                            → 550  ← target은 진짜 valid

random local part는 entropy ≥ 80 bit (UUID v4 권장). 일부 catch-all은 길이 휴리스틱으로 짧은 random만 250 → entropy 충분히 줘야 함.

왜 100%가 아닌가

  • M365 tenant가 recipient filter를 꺼두면 모든 250 → catch-all 같지만 실제로는 mailbox만 inbox 도착, 나머지는 NDR 후처리 (deferred reject).
  • Hybrid 환경 (on-prem Exchange + M365)에서 edge transport가 250, 내부 routing에서 550.
  • 일부 MTA는 RCPT 250이지만 DATA 단계에서 554 5.7.1 No such user.

ML 기반 catch-all 추론

Feature의미
MX provider (Google/Microsoft/Zoho/self)tenant의 recipient filter 기본값
Domain age (WHOIS)신규 도메인일수록 catch-all 多
과거 verify 결과 분포history의 250 비율
TLD 종류.shop .click .top catch-all 多
다중 길이 random probe 일관성정교한 catch-all 탐지

L5. Disposable Email Detection

정적 Blocklist (2026-05)

저장소도메인 수갱신
disposable-email-domains/disposable-email-domains~3,800주간
7c/fakefilter~145,000일간
castle/disposable-email-domains~12,000일간
mailchecker (FGRibreau)~55,000주간
wesbos/burner-email-providers~4,200비정기

동적 회피의 진화

  • Subdomain rotation: temp-mail.org*.temp-mail.org 무한 생성.
  • wildcard MX: 한 MX가 수백 도메인 서비스 → MX clustering으로 묶어 차단.
  • registrar 시그널: Namecheap/Cloudflare WHOIS privacy + 7일 이내 등록 → high score.
  • Cloudflare Workers / Vercel로 무료 disposable 서비스 다수 → IP/AS 추적 어려움.

인프라 기반 동적 탐지 (Castle 2026)

1. MX 클러스터링 — 같은 MX target 공유하는 도메인 그룹화
2. Web 페이지 fingerprint — "view inbox" UI 자동 크롤
3. Registrar/age/privacy — WHOIS, RDAP
4. ML classification — 위 feature로 binary classifier

L6-7. Role-Based · Honeypot · Freemail

Role-based 로컬파트 (de-facto 표준)

info, sales, support, contact, admin, administrator, webmaster,
postmaster (RFC 5321 §4.5.1 필수), abuse (RFC 2142 필수),
noc, security, hostmaster, marketing, billing, accounts,
hr, jobs, careers, office, mail, no-reply, noreply, do-not-reply
주의: RFC 2142는 postmaster, abuse, noc, security반드시 존재해야 하는 mailbox로 정의. 이 4개를 "invalid"로 처리하면 안 됨.

왜 risky인가

영향메커니즘
Bounce 증가회사 퇴직/리브랜딩으로 자주 사라짐
Complaint 3~5×공용 inbox라 마케팅 메일에 즉시 spam 신고
Engagement −40%open/click 낮음 → ESP reputation 악화
Spam trap 전환사용 안 하는 info@가 recycled trap으로

Spam Trap / Honeypot — 두 종류

유형정의검증 가능성
Pristine trap처음부터 함정용. 웹페이지 hidden form에 박아 scraper만 수집사실상 탐지 불가 — RCPT 250 정상 valid 응답
Recycled trap한때 진짜 사용자였다가 6+개월 dormant 후 ISP가 재활성일부 가능 — 과거 engagement 데이터

알려진 honeypot 운영자

  • Spamhaus (DNSBL 운영용 trap)
  • SpamCop / Cisco Talos
  • AOL / Yahoo의 inactive account 재활용
  • Validity (Sender Score) — paid pristine trap
  • Spamtrap.io, MailerCheck

Freemail 도메인 list

gmail.com, googlemail.com, yahoo.com (+ 30+ TLD variants),
outlook.com, hotmail.com, live.com, msn.com,
icloud.com, me.com, mac.com,
aol.com, protonmail.com, proton.me, tutanota.com,
zoho.com, gmx.com, yandex.com, mail.ru,
naver.com, daum.net, hanmail.net, kakao.com,
qq.com, 163.com, 126.com, sina.com

L7-8. IP 평판 · ML / AI Score

주요 DNSBL (2026)

목록운영영향력
Spamhaus ZEN (SBL+XBL+PBL)Spamhaus최대 (Tier-1 ISP 대부분 사용)
Spamhaus DBLSpamhausdomain-level
Spamhaus ZRDSpamhaus신규 도메인 (0-day)
Barracuda BRBLBarracudaBarracuda 어플라이언스
UCEProtect L1/L2/L3UCEProtectaggressive, L3 는 /24 전체 차단
SpamCop SCBLCisco Talos빠른 falsy/만료
SORBS2024 영구 폐쇄

DNSBL 조회 wire 예시

$ dig +short 1.2.0.192.zen.spamhaus.org
127.0.0.4              ← 응답 있음 = 등재. 4 = XBL CBL (botnet)

ML scoring feature set

features = {
  # Address-level
  "local_part_entropy": shannon_entropy(local),    # bot-generated 식별
  "local_part_keyboard_pattern": ...,              # 'qwerty', 'asdf'
  "local_part_role_score": role_lookup(local),

  # Domain-level
  "domain_age_days": whois_age(domain),
  "domain_mx_provider": classify_mx(mx_records),
  "domain_has_spf": bool, "domain_has_dmarc": bool,
  "domain_dmarc_policy": "none|quarantine|reject",
  "domain_alexa_rank": ...,
  "domain_https_cert_age": ...,

  # SMTP probe
  "smtp_250_returned": bool,
  "smtp_catchall_signal": bool,
  "smtp_greylist_signal": bool,
  "smtp_response_latency_ms": int,

  # Historical
  "past_bounce_rate_on_domain": float,
  "past_engagement_rate": float,
  "list_source_quality": "double_optin|single|scraped|purchased",
}

학습 데이터: ESP의 수억 건 send + bounce/open/click + complaint label. xgboost / LightGBM으로 0~1 deliverability score. 임계값별 분류:

Score라벨Action
≥ 0.9safesend
0.7~0.9low risksend (monitor)
0.4~0.7riskysend only if warm
0.2~0.4unknowndon't send, manual review
< 0.2invalidhard-suppress

LLM 보조 활용 (2025~)

  • 도메인 정당성 평가: 도메인 + 회사명 + 웹사이트 텍스트를 LLM에 던져 "이게 진짜 운영되는 회사인가" 판단. 신규 도메인 false positive 감소.
  • Role/department 분류 일반화: recruiting, talent-acquisition, people-ops 변형 잡음.
  • 답장 의도 분류: bounce 가 아닌 OOO/Auto-reply/거절 분류.

Edge Cases

Subaddressing / Plus addressing

  • Gmail: user+anything@gmail.comuser@gmail.com 라우팅. . 무시 (u.s.e.r == user).
  • iCloud, FastMail, ProtonMail: 지원.
  • M365: tenant-level (2021부터 기본 on).
  • Yahoo: -tag 지원 (user-tag@yahoo.com), + 미지원.
function normalizeGmail(email: string): string {
  const [local, domain] = email.toLowerCase().split('@');
  if (domain !== 'gmail.com' && domain !== 'googlemail.com') return email;
  const stripped = local.split('+')[0].replace(/\./g, '');
  return `${stripped}@gmail.com`;
}

IDN (한글/일본어/중국어)

한국가나다.com  →  xn--bj0bj3in1f8a9ca.com   (Punycode, IDNA 2008)
日本語.jp       →  xn--wgv71a119e.jp

EAI UTF-8 local part — SMTPUTF8 확장

EHLO verifier.example.com
250-mx.example.com Hello
250-SMTPUTF8                       ← 이게 있어야 UTF-8 가능
250 8BITMIME
MAIL FROM:<probe@verifier.example.com> SMTPUTF8
250 OK
RCPT TO:<用户@example.com>
250 OK

IP literal · Loop MX · Sub-domain MX without parent A

  • user@[192.0.2.1], user@[IPv6:2001:db8::1] — syntax valid, 검증 도구는 보통 reject.
  • MX target에 A record 없으면 RFC 5321 §5.1 violation → 5.4.4.
  • MX가 자기 자신 (loop): valid (implicit MX와 동일).

5. 자체 구현 타당성 — Layer별 난이도

Layer검증 항목난이도정확도 한계비고
1Syntax (RFC 5322)매우 쉬움 (1일)~99%regex+IDN/유니코드만 주의
2MX lookup쉬움 (3일)~98%DNS resolver, TTL 캐시, A fallback
2.5Disposable / role / freemail쉬움 (1주)데이터 신선도 의존매일 새 도메인 갱신 필요
3SMTP probing (RCPT TO)매우 어려움30~70%진짜 본 게임 — 아래 상세
4Catch-all 판별불가능에 가까움ML 없이 ~50%상용업체의 진짜 해자
5Spam trap 탐지자체 불가0%상용 vendor의 독점 DB

Layer 3가 어려운 5가지 메커니즘

(a) Spamhaus 등재 메커니즘

  • 검증 IP가 RCPT TO 폭주 → 수신 MTA가 reputation feed (Spamhaus DRD, Cisco SenderBase, Cloudmark)에 신고
  • Spamhaus PBL (Policy Block List)는 "정상 mail server가 아닌 IP"를 등재 → 등재까지 수 시간 ~ 24시간
  • 등재 후 delist 절차 복잡, 동일 IP 재발 시 영구 등재
  • 결과: 검증 IP 1대로 1만~5만 건 시도 후 사실상 사망 → IP rotation 필수

(b) Microsoft 365 anti-probing

  • Exchange 2013부터 recipient validation을 post-DATA로 이동 → RCPT 단계에서 invalid도 250 OK
  • 모든 RCPT TO가 250 → "이 도메인은 catch-all"처럼 위장 → SMTP probing 결과 전체 무력화
  • outlook.com (consumer)은 여전히 550이나 452 throttling으로 verifier 트래픽 차단

(c) Gmail anti-probing

  • 모든 RCPT TO에 "disabled" 응답 → Reacher도 공식 문서에서 "Gmail SMTP probing은 무의미"
  • 대안 Headless WebDriver (비밀번호 복구 페이지 입력) — 그러나 reCAPTCHA / behavioral fingerprint로 차단
  • 공개 벤치마크: 3,000건 Gmail 실주소 + 300건 invalid — 최고 툴이 70%

(d) Yahoo anti-probing

  • SMTP tarpitting — RCPT TO 응답을 의도적으로 5~30초 지연 → throughput 붕괴
  • 대량 probing 감지 시 4xx greylisting → 24시간 후 재시도 요구

(e) 결과 — 무료/저가 툴 정확도가 떨어지는 이유

  • mailtester.com, Hunter free, MailerCheck free는 IP 단일/소수 → 곧 Spamhaus 등재 → 검증 결과가 stale cache + 패턴 추정
  • 빅3 (Gmail/Outlook/Yahoo)는 SMTP로 못 풀고 historical bounce database + ML로만 풀린다 → 자본력 게임

인프라 요구사항 — 자체 구축 시 BoM

항목사양월 USD비고
Verification IP pool10~20개 clean IP (PTR · warmup 완료)$50~$200OVH/Hetzner colocation (AWS는 outbound 25 막힘)
SOCKS5 outbound proxy5~10개 (port 25 우회)$100~$300Reacher 공식 권장
Compute (verifier)4 vCPU × 2~4대$80~$160Rust/Go면 1대로도 가능
DNS resolverunbound self-host$20NXDOMAIN 캐시 필수
Redis (cache + queue)4GB managed$30~$60BullMQ + 결과 캐시
Postgres (결과 영속)2 vCPU/4GB$40~$8030~90일 캐시
Disposable list updatercron$0github.com/disposable 매일 pull
모니터링mxtoolbox / HetrixTools$30~$50Spamhaus 등재 알람
소계 (인프라)$350~$870/월
초기 개발 (~200h × $100)1회$20,000senior eng
운영·튜닝 (월 20h × $100)매월$2,000IP delist, on-call
TCO 1년차$26,000~$30,000100만 건/월 처리 시 단가 ≈ $0.0022/건
핵심 함정:
  • AWS/GCP/Azure outbound 25 차단 — 우회하려면 OVH/Hetzner/Vultr + SOCKS5 proxy
  • IP warmup 7~14일 안 하면 1일 만에 PBL 등재
  • 도메인당 동시 연결 1~2개 / 분당 RCPT 10~20회 이상 시 throttling — throughput 상한 명확

정확도 공개 벤치마크 종합

솔루션Public claim실측차이 원인
자체 SMTP probing only30~70%anti-probing 직격
자체 + disposable + ML 룰80~85%catch-all 추정 불가
Reacher self-host (OSS)99% invalid 만safe 라벨 bounce ≤3% 보장recall/coverage 보장 X
ZeroBounce99%96~97%수십억 historical + AI
Bouncer99.5%~97%catch-all ML
MillionVerifier99%~95%catch-all 회피 전략

상용이 자체보다 정확한 진짜 이유 — 3가지 해자

  1. 수십억 건 historical bounce DB — 같은 이메일의 과거 30/60/90일 hard bounce 이력. SMTP probing으로 못 풀어도 "지난주에 bounce 났다" 한 줄로 invalid 판정.
  2. Pristine spam trap 자체 DB — ISP/anti-spam org와의 파트너십·자체 honeypot 운영. 신규 트랩 추적.
  3. Catch-all ML — 도메인 과거 bounce rate · 발송된 이메일 syntax 패턴 · role/personal 분류로 catch-all 도메인 내 유효/무효 확률 예측.
위 3가지는 scale (cumulative send history)에서만 나오는 데이터 — 신규 진입자가 절대 따라잡을 수 없는 해자.

6. 비용 · ROI 시나리오

가격 카드 (2026)

벤더100만 건1000만 건비고
MillionVerifier$549~$0.0004/건최저가
Bouncer$2,000~$0.0006/건중간
ZeroBounce$2,250~$0.0020/건최고급
SendGrid Validation$2,000~$0.002/건ESP 통합
자체 TCO$700/월 인프라 + 개발 상각건당 $0.0003 (1년차) / $0.00012 (3년차)발송량 ↑ 시만 유리

시나리오별 Break-even

시나리오자체 1년차상용 1년차Break-even권장
10만/월 (120만/년)$26,000MV $660 / ZB $3,300자체가 40배 비쌈상용 압승
100만/월 (1,200만/년)$30,000MV $6,600 / ZB $33,000자체 ≈ ZB 수준상용 (정확도+운영 부담)
1,000만/월 (1.2억/년)$50,000MV $48,000 / ZB $240,000자체 ≈ MV하이브리드
1억/월$150,000MV $480,000 / ZB $2.4M자체 압승자체 + 상용 trap DB API
직관: 자체 구현은 유지보수 인건비 $2k/월 = 100만 건/월 MillionVerifier 비용 ($549)의 4배. 발송량과 무관하게 OPS 고정비가 항상 든다. 월 10만 미만이면 자체 구현은 ROI 무조건 마이너스.

7. 하이브리드 전략 (월 10만~1000만 구간)

┌──────────────────────────────────────────────────────────────┐
│ L1: Syntax (regex, RFC 5322)         [자체, 무료, ~99%]      │
├──────────────────────────────────────────────────────────────┤
│ L2: MX lookup + A fallback           [자체, 무료, ~98%]      │
├──────────────────────────────────────────────────────────────┤
│ L2.5: Disposable / role / freemail   [자체 OSS list, 무료]   │
├──────────────────────────────────────────────────────────────┤
│ L3: Cache lookup (Redis/PG 30~90일)  [자체, hit rate 60~80%] │
├──────────────────────────────────────────────────────────────┤
│ L4: 상용 API (MillionVerifier 등)    [miss 분만, $0.0005/건] │
├──────────────────────────────────────────────────────────────┤
│ L5: 발송 후 bounce 피드백 → cache 갱신 [자체 학습 루프]      │
└──────────────────────────────────────────────────────────────┘

비용 절감 — 캐시 hit rate 70% 가정

시나리오naive 상용하이브리드절감률
100만 건/월 (MV)$549$549 × 0.7 × 0.3 = $11579%
100만 건/월 (ZB)$2,750$57879%

실전 파이프라인 의사 코드

type VerifyResult = {
  status: 'valid' | 'invalid' | 'catch_all' | 'unknown' | 'risky';
  confidence: number;          // 0..1
  reasons: string[];
};

async function verify(email: string): Promise<VerifyResult> {
  const reasons: string[] = [];

  // L1: Syntax
  const parsed = parseAddress(email);              // RFC 5321 envelope
  if (!parsed.ok) return fail('invalid', 1.0, ['syntax']);

  // L2: DNS / MX
  const mx = await resolveMx(parsed.domain);
  if (mx.nullMx) return fail('invalid', 1.0, ['null_mx']);
  if (mx.records.length === 0) {
    const a = await resolveA(parsed.domain);
    if (a.length === 0) return fail('invalid', 1.0, ['no_mx_no_a']);
  }

  // L5: Disposable
  if (await isDisposable(parsed.domain, mx.records)) {
    return { status: 'risky', confidence: 0.9, reasons: ['disposable'] };
  }

  // L3: Cache lookup (Postgres 90일)
  const cached = await db.cache.lookup(email);
  if (cached && !cached.expired) return cached;

  // L6: Role
  if (ROLE_LOCALS.has(parsed.local) && !RFC2142_REQUIRED.has(parsed.local)) {
    reasons.push('role_based');
  }

  // L4: 상용 API call (cache miss 만)
  const result = await commercialApi.verify(email, {
    senderDomain: pickWarmSenderDomain(),
    sourceIp:     pickWarmIp(),
  });

  // BIG_PROVIDER → ML 보정
  if (BIG_PROVIDER_ALWAYS_250.has(mx.providerKey)) {
    reasons.push('provider_always_250');
    return mlScore(email, { reasons, smtp: 'unreliable' });
  }

  await db.cache.upsert(email, result);
  return result;
}

린다(앱린다) 권장 구현 단계

  1. L1-2 자체elysia-server/src/services/email-verification/ 신규. Node dns + email-validator + disposable-email-domains (매일 cron pull). 개발 1주.
  2. Cache (Postgres)email_verification_cache 테이블, UUIDv7 PK, keyset cursor, 90일 TTL. bun db:generate로 migration 추가.
  3. 상용 API — MillionVerifier 시작 (가성비). enterprise tier 시 ZeroBounce 마이그레이션 옵션. BullMQ로 검증 잡 분리.
  4. Bounce 학습 루프 — SES/SendGrid bounce webhook → suppression list + cache invalid 마킹. 기존 aws-ses · sendgrid skill의 suppression API 연동.
  5. B2B 한국 도메인은 자체 SMTP probing optional — outbound 25 가능 별도 VPS 1대 (AWS 본 인프라 격리). 어려우면 skip.
Anti-pattern (하지 말 것):
  • AWS EC2에서 outbound 25 우회로 SMTP probing → port block + IP 등재로 본 발송 인프라 deliverability 동반 추락
  • Free disposable list 1회 import 후 방치 → 6개월 뒤 신규 도메인 70% 누락
  • catch-all 도메인을 valid로 마킹 후 발송 → bounce rate 폭증 → SES production access 정지 위험
  • 자체 검증 결과만 신뢰하고 bounce webhook 미연결 → cache가 stale 상태로 굳음

8. 한국 · 동아시아 특화

도메인 / 이슈동작 / 권장
naver.comSMTP probing 응답 일관성 낮음. SPF/DKIM/DMARC 체크가 더 신뢰적. catch-all 아님
daum.net / hanmail.netKakao 통합 운영. SPF에 Daum mail server 포함. 동일 사용자가 3개 alias 보유 가능 → 중복 dedup 주의
docomo.ne.jp / au.com / softbank.ne.jpcarrier email은 strict whitelist (수신측 sender approval). 검증보다 발신 도메인 사전 등록이 더 중요
qq.com / 163.com / 126.com만리방화벽으로 outbound SMTP probing 자체가 timeout. 상용 API도 정확도 낮음. 검증 무의미, 발송 시 throttling 필수
IDN (.한국, 한글@한글.kr)RFC 6530/EAI. punycode 변환 (xn--) 필수. Node email-validator/idna-uts46가 처리
B2B 한국 기업자체 mail server (postfix/zimbra/MS Exchange on-prem) 비중 높음 → SMTP probing 비교적 정직하게 응답 (anti-probing 안 함). Rinda 같은 B2B 대상은 한국 도메인 자체 SMTP probing 정확도 비교적 높음 (~85%)

한국 결제 친화도

서비스한국 카드한글 UI대안 결제
MyEmailVerifier Alipay · 암호화폐 · Amazon Pay
Emailable Apple Pay · Google Pay
ZeroBounce · NeverBounce · Bouncer 등Stripe / PayPal

전 서비스 영어 only. 한글 인터페이스는 어떤 서비스도 제공하지 않음.


10. 실전 권고 · 결론

발송량 / 사용케이스 매트릭스

발송량사용 케이스권장 전략월 비용
< 10만/월모든 케이스상용 단독 (MillionVerifier) + Redis 30일 캐시$50~$200
10만~100만/월B2C / freemail 위주하이브리드: 자체 L1-2 + MV + 캐시$100~$500
10만~100만/월B2B / corporate하이브리드: 자체 L1-2 + ZeroBounce or Bouncer + 캐시$300~$1,500
100만~1000만/월mixed하이브리드 + 캐시 hit 70%+ 학습 루프$500~$3,000
> 1000만/월mixed자체 SMTP (Reacher) + 상용 fallback (catch-all/trap만)$5,000~$15,000
B2B 한국·일본 (린다)콜드세일즈하이브리드 + bounce 피드백 학습 (Rinda 패턴)$300~$1,500

사용 시나리오별 서비스 추천

시나리오1순위2순위이유
B2B 콜드메일 (catch-all 多)BouncerZeroBounce Verify+Google/M365 deep verify, toxicity
대량 cleaning (1M+)MyEmailVerifierDeBounce / MillionVerifier1M $399~$549
엔터프라이즈 (SOC2/Salesforce)BriteVerifyZeroBounce컴플라이언스 + SF 네이티브
실시간 API (폼 검증)Bouncer ShieldZeroBounce낮은 latency, webhook
EU 데이터 주권BouncerVerifalia / DeBounceEU-only residency
속도 우선 (10K <2분)EmailableBouncer0.012초/건
한국 결제 편의MyEmailVerifierEmailableAlipay / Apple Pay
ZoomInfo 사용 중NeverBounce번들 무료
HubSpot 사용 중KickboxZeroBounceMarketplace 공식
Finder + Verify 통합HunterClearoutprospecting 일체화

핵심 한 줄

2026년 자체 SMTP probing은 죽었다. 빅3 anti-probing + Spamhaus 등재 메커니즘 + spam trap DB 독점 때문이다. 린다(앱린다)의 현재 단계에서는 상용 API ($0.0005/건) + Postgres 90일 캐시 + bounce 학습 루프만이 ROI가 나오며, 자체 구현은 발송량 월 1000만 건 + 전담 인프라 엔지니어가 있을 때만 검토 가치가 있다.

2026 검증의 본질 6가지

  1. SMTP probing의 시대는 저물고 있다. Gmail/M365/Yahoo/Apple/Proton의 일관된 차단으로 글로벌 메일의 70%+가 SMTP-level 검증 불가능.
  2. 레이어드 신호 + ML score가 표준. 단일 250/550보다 도메인 reputation · list source quality · historical engagement가 정확도 ↑.
  3. Disposable / catch-all은 동적. 정적 list만으론 부족, MX 클러스터링 + WHOIS + ML 분류.
  4. Pristine spam trap은 탐지 불가. 최선의 방어는 list source 자체 통제 (double opt-in, web form CAPTCHA, ICP 필터).
  5. SPF/DKIM/DMARC 정렬은 검증의 전제조건. 정렬 안 된 sender의 verify probe는 점점 더 많이 거부됨.
  6. Karpathy 원칙: 단일 라이브러리에 의존하지 말고 (overfitting), 레이어별로 confidence를 누적해 threshold 정책으로 결정.