MillionVerifier 최저가
본사 헝가리(EU) · 정확도 99% claim / 95.8% 실측 · 모델 만료없는 PAYG
✓ 업계 최저가, 100% 환불 보증, catch-all 미과금 (risky로만 표시)
✗ SOC2 미인증, 한글 UI 없음, catch-all을 결국 사용자가 직접 처리해야 함
MillionVerifier · ZeroBounce · Bouncer 등 12개 서비스의 가격과 정확도, RFC 기반 8-layer 기술 원리, 그리고 "직접 만들 것인가 살 것인가" 의사결정까지 한 곳에서.
250을 던지거나 IP를 차단해서, 글로벌 메일 70%+가 SMTP-level 검증 불가능.| 군 | 대표 | 강점 | 가격 (100K) |
|---|---|---|---|
| B2B catch-all 강자 | Bouncer · ZeroBounce Verify+ | Google Workspace / M365 deep verify, unknown 0.3~3% | $349~$400 |
| 가격 최적화 | MillionVerifier · MyEmailVerifier · DeBounce | 1M 건당 $400~550, 평생 만료없는 PAYG | $79~$129 |
| 엔터프라이즈 컴플라이언스 | BriteVerify · ZeroBounce · NeverBounce | SOC2 Type 2 + ISO 27001 + Salesforce 네이티브 | $349~$600 |
본사 헝가리(EU) · 정확도 99% claim / 95.8% 실측 · 모델 만료없는 PAYG
✓ 업계 최저가, 100% 환불 보증, catch-all 미과금 (risky로만 표시)
✗ SOC2 미인증, 한글 UI 없음, catch-all을 결국 사용자가 직접 처리해야 함
본사 미국 · 정확도 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% 과장 마케팅
본사 폴란드(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 진행중(아직 미완료)
본사 미국 · 정확도 99.9% / 93~97% 실측 · 모델 PAYG + 월구독
✓ ZoomInfo 번들로 ZI 사용자는 사실상 무료, 엔터프라이즈 안정성
✗ 인수 후 혁신 정체, PAYG/구독 가격 역전, 수동 review로 10분~2시간 지연 발생
본사 미국 · 정확도 67~98% (벤치마크별 편차 큼)
✓ Sendex 0~1 점수로 segment 가능, HubSpot Marketplace 공식 앱
✗ catch-all 약함, 크레딧 12개월 만료, 가격 평범
본사 미국 · 10K 처리 2분 (0.012초/건) 업계 최고
✓ 속도 1위, Apple Pay / Google Pay 결제 (한국 카드 편의), 무료 250건, Inbox Placement 통합
✗ catch-all 평범, EU 호스팅 옵션 약함
본사 인도 · 정확도 98% claim / 98.1% 실측
✓ 가격 대비 정확도 좋음, Email Finder 통합 (4 credit/건)
✗ 인도 본사 (data residency 민감 시), catch-all 평범
본사 프랑스 · 정확도 95% claim / 70~96% 실측 편차
✓ Email Finder가 본업 (B2B prospecting 통합), Sheets add-on, Chrome ext
✗ 순수 검증 단가 비쌈 ($7.45/1K), catch-all 약함
본사 미국 (Validity 산하) · ISO 27001 / 27701
✓ Salesforce 네이티브 매니지드 패키지, phone + 우편주소 verification 동봉
✗ 비쌈, 크레딧 1년 만료, 셀프서비스 UX 약함
본사 인도 · 매일 100건 무료 영구 갱신
✓ 업계 최저가, Alipay·암호화폐·Amazon Pay 결제, AICPA 인증
✗ 3rd party 정확도 벤치마크 부족, API 초기 rate 30/min
본사 이탈리아 (독일 DC) · 품질 레벨 3단계 (Standard / High / Extreme)
✓ 속도-정확도 tradeoff 명시적, EU 데이터 주권, SDK 가장 풍부 (Go/Node/Python/.NET/Java)
✗ 일일 만료 크레딧, 기본 정확도 mid-tier (92~95%)
본사 에스토니아(EU) · 97.5%+ deliverability 보증
✓ 가격 매우 저렴 ($0.5/1K @1M), 명시적 보증, EU 호스팅, 별도 catch-all validator (10 credit)
✗ 브랜드 인지도 낮음, catch-all은 10x 크레딧
| 서비스 | 1K | 10K | 100K | 1M | 실효 단가/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로 환산
| 등급 | 서비스 | 방식 | 비고 |
|---|---|---|---|
| S | Bouncer | Google Workspace · M365 deep SMTP probing | unknown 0.3~3%, 업계 1위 |
| S | ZeroBounce Verify+ | 추가 비용 multi-pass | 표준 모드는 lenient(B+급) |
| A | Verifalia (Extreme) | 9× 크레딧, greylist retry | 시간 들이면 정확 |
| A | DeBounce catch-all validator | 10× 크레딧 옵션, server response 분석 | 명시적 추가검증 |
| B | Kickbox (Sendex) · Emailable | 0~1 또는 0~10 점수 | binary 아닌 segmentation |
| B | NeverBounce · Hunter | catchall status 명시 분류 | 점수 없음 |
| C | MillionVerifier | 검증 안 함, 크레딧 환불 | 사용자 결정에 위임 |
| C | Clearout · BriteVerify · MyEmailVerifier | risky / greylisted 일괄 분류 | 추가 점수 없음 |
| 서비스 | Unknown % | Catch-all % | 평가 |
|---|---|---|---|
| Bouncer | 0.3~3% | deep verify로 절반 resolution | ★ |
| ZeroBounce | 1.69% | 10.8% (Verify+ 사용 시 ↓) | ★ |
| MillionVerifier | ~0%* | catch-all 전부 risky 분류 | 운영상 0% (risky는 별도) |
| NeverBounce | 3~5% | 8% | 평균 |
| Emailable | 4~6% | 12% | 평균 |
| Hunter | 5~10% | 15~20% | catch-all 약함 |
* MillionVerifier는 unknown을 청구하지 않는 정책 — 운영상 0%지만 실제 검증 못 한 것
| 서비스 | 10K 처리 시간 | 시간당 throughput |
|---|---|---|
| Emailable 1위 | 2분 | ~300K/h |
| MillionVerifier | 3분 24초 | ~180K/h |
| ZeroBounce | 3분 36초 | ~100~150K/h |
| Bouncer | — | 200K+/h (claim) |
| NeverBounce | 5~10분 (수동 review 시 +2h) | 100K/h |
| MyEmailVerifier | <1시간 (100K) | ~100K/h |
| 서비스 | SOC2 T2 | ISO 27001 | GDPR | EU 호스팅 | 리스트 정책 |
|---|---|---|---|---|---|
| ZeroBounce | ✓ | ✓ | ✓ | ✓ | EU 서버 옵션 |
| BriteVerify | partner | ✓ (27001/27701) | ✓ | ✓ | Validity Trust Center |
| Bouncer | 진행중 | ✓ | ✓ | EU-only | 검증 직후 폐기 |
| Verifalia | — | — | ✓ | 독일 DC | 자동 삭제 |
| NeverBounce | ✓ (ZI) | ✓ | ✓ | ✓ | ZoomInfo Trust |
| DeBounce | — | — | ✓ | EU | 직후 폐기 |
| Kickbox | ✓ | — | ✓ | 미국 | 자체 |
| Hunter | ✓ | — | ✓ | 프랑스 | 자체 |
이메일 검증은 8개 레이어의 누적 신호(stacked signal) 시스템이다. 단일 레이어로 끝나지 않으며, 각 레이어의 confidence를 누적해 threshold 정책으로 결정한다.
| Layer | 검증 항목 | 단독 정확도 | 비용 | 거짓응답 위험 |
|---|---|---|---|---|
| L1 | Syntax (RFC 5322) | 30~40% | 0 | 낮음 |
| L2 | DNS · MX (RFC 5321 §5.1) | 50~60% | 1 RTT | 낮음 |
| L3 | SMTP probing (RCPT TO) | 70~85% | 3~5 RTT | 매우 높음 |
| L4 | Catch-all 추론 | +5~10% | 2 RTT | M365는 항상 catch-all 응답 |
| L5 | Disposable 도메인 | +3~5% | DB lookup | 동적 회피 |
| L6 | Role-based | +1~2% | string match | 의미 분류 |
| L7 | Spam-trap / Honeypot | -∞ (필터) | ML / DB | pristine trap 탐지 불가 |
| L8 | ML · 평판 score | 종합 | high | 학습 편향 |
| RFC | 영역 | 핵심 규정 |
|---|---|---|
| RFC 5321 (SMTP) | 전송 envelope | MAIL 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 5598 | Architecture | MUA / MSA / MTA / MDA 역할 |
| RFC 6530~6533, 8616 | EAI · SMTPUTF8 | UTF-8 local part / domain, downgrade rules |
"a b c"@x.com은 5322는 허용하지만 5321 envelope에서는 거부하는 MTA가 다수.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
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 quoted | EAI UTF-8 |
|---|---|---|---|
validator.js isEmail | syntax | partial | opt-in |
email-validator (npm) | syntax+simple | — | — |
mailauth | SPF/DKIM/DMARC/ARC | n/a | yes |
deep-email-validator | syntax+DNS+SMTP+disposable | partial | partial |
Python email-validator (JoshData) | syntax+DNS | yes | yes |
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
example.com. IN MX 0 .
exchange가 . (zero-length label, root) → 이 도메인은 mail을 받지 않음. 클라이언트는 556 Server does not accept mail + 5.1.10으로 즉시 permfail. 검증 단에서 확정 invalid로 분류 가능.
dig +nocookie +tries=1 또는 Unbound/CoreDNS 권장. Node dns.promises.resolveMx는 OS resolver 의존이라 캐시 동작이 불투명.AD flag로 인증된 NXDOMAIN/null MX 신뢰 가능.$ 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 존재 여부 판정. 메일은 실제 발송 안 됨.| 코드 | 카테고리 | 의미 | verifier 해석 |
|---|---|---|---|
| 250 | Success | mailbox accepted | valid (단, catch-all 가능성) |
| 251 | Success | user not local, will forward | valid (relay) |
| 252 | Success(약함) | cannot VRFY, but accept | 불확실 — M365 default |
| 450 | Transient | mailbox temp unavailable | greylist 의심 |
| 451 | Transient | local error / greylist | greylist 의심 |
| 452 | Transient | over quota | retry |
| 550 | Permanent | mailbox unavailable | invalid (or IP 차단) |
| 553 | Permanent | mailbox name not allowed | invalid (syntax 거부) |
| 554 | Permanent | transaction failed | invalid 또는 IP 차단 |
| 556 | Permanent | domain does not accept mail | Null MX (RFC 7505) |
RCPT TO:<obviously-fake-zxcvbnm@catchall.com>
250 2.1.5 OK
도메인 owner가 *@catchall.com을 한 mailbox로 라우팅. 모든 주소에 250. Postfix smtpd_reject_unlisted_recipient = no가 대표.
RCPT TO:<real.user@example.com>
451 4.7.1 Greylisted, try again later
처음 보는 (sender_ip, sender, recipient) 3-tuple에 4xx 던지고 재시도 기다림. Verifier가 한 번에 판정 못 함.
서버가 응답을 인위적으로 5~30초 delay → connection pool 고갈, throughput 폭락. Postfix smtpd_error_sleep_time이 대표.
RCPT TO:<real.user@protected.com>
550 5.7.1 Verification probe denied
대규모 verifier IP 대역 (ZeroBounce, Hunter, Bouncer 등) IP/ASN 미리 차단. 정상 RCPT도 550.
수신 MTA가 MAIL FROM: 도메인의 SPF/DKIM/DMARC를 확인한 뒤 결정. Verifier가 자체 도메인으로 EHLO 하면 reputation 낮아 550. 대형 verifier는 회전 sender domain pool + 각각 SPF/DKIM/DMARC + warm-up으로 우회.
| 제공자 | 검증 probe 동작 | 회피 가능성 |
|---|---|---|
| Gmail | 모든 RCPT 250 응답 (catch-all처럼 동작) + DATA에서 reject | 거의 불가능 |
| Microsoft 365 | Recipient Filtering 기본 Anonymous restrictions → 250 통과, 실제 mailbox 검증 X | 불가능 |
| Yahoo / AOL | 검증 IP 대역 광범위 차단, 421 timeout | 불가능 |
| iCloud | EHLO 직후 421 throttle / probe IP 차단 | 불가능 |
| ProtonMail | RCPT 모두 250 (catch-all처럼 동작) | 불가능 |
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 충분히 줘야 함.
554 5.7.1 No such user.| 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 탐지 |
| 저장소 | 도메인 수 | 갱신 |
|---|---|---|
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 | 비정기 |
temp-mail.org → *.temp-mail.org 무한 생성.1. MX 클러스터링 — 같은 MX target 공유하는 도메인 그룹화 2. Web 페이지 fingerprint — "view inbox" UI 자동 크롤 3. Registrar/age/privacy — WHOIS, RDAP 4. ML classification — 위 feature로 binary classifier
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
postmaster, abuse, noc, security를 반드시 존재해야 하는 mailbox로 정의. 이 4개를 "invalid"로 처리하면 안 됨.| 영향 | 메커니즘 |
|---|---|
| Bounce 증가 | 회사 퇴직/리브랜딩으로 자주 사라짐 |
| Complaint 3~5× | 공용 inbox라 마케팅 메일에 즉시 spam 신고 |
| Engagement −40% | open/click 낮음 → ESP reputation 악화 |
| Spam trap 전환 | 사용 안 하는 info@가 recycled trap으로 |
| 유형 | 정의 | 검증 가능성 |
|---|---|---|
| Pristine trap | 처음부터 함정용. 웹페이지 hidden form에 박아 scraper만 수집 | 사실상 탐지 불가 — RCPT 250 정상 valid 응답 |
| Recycled trap | 한때 진짜 사용자였다가 6+개월 dormant 후 ISP가 재활성 | 일부 가능 — 과거 engagement 데이터 |
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
| 목록 | 운영 | 영향력 |
|---|---|---|
| Spamhaus ZEN (SBL+XBL+PBL) | Spamhaus | 최대 (Tier-1 ISP 대부분 사용) |
| Spamhaus DBL | Spamhaus | domain-level |
| Spamhaus ZRD | Spamhaus | 신규 도메인 (0-day) |
| Barracuda BRBL | Barracuda | Barracuda 어플라이언스 |
| UCEProtect L1/L2/L3 | UCEProtect | aggressive, L3 는 /24 전체 차단 |
| SpamCop SCBL | Cisco Talos | 빠른 falsy/만료 |
| — | 2024 영구 폐쇄 |
$ dig +short 1.2.0.192.zen.spamhaus.org 127.0.0.4 ← 응답 있음 = 등재. 4 = XBL CBL (botnet)
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.9 | safe | send |
| 0.7~0.9 | low risk | send (monitor) |
| 0.4~0.7 | risky | send only if warm |
| 0.2~0.4 | unknown | don't send, manual review |
| < 0.2 | invalid | hard-suppress |
recruiting, talent-acquisition, people-ops 변형 잡음.user+anything@gmail.com → user@gmail.com 라우팅. . 무시 (u.s.e.r == user).-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`;
}
한국가나다.com → xn--bj0bj3in1f8a9ca.com (Punycode, IDNA 2008) 日本語.jp → xn--wgv71a119e.jp
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
user@[192.0.2.1], user@[IPv6:2001:db8::1] — syntax valid, 검증 도구는 보통 reject.| Layer | 검증 항목 | 난이도 | 정확도 한계 | 비고 |
|---|---|---|---|---|
| 1 | Syntax (RFC 5322) | 매우 쉬움 (1일) | ~99% | regex+IDN/유니코드만 주의 |
| 2 | MX lookup | 쉬움 (3일) | ~98% | DNS resolver, TTL 캐시, A fallback |
| 2.5 | Disposable / role / freemail | 쉬움 (1주) | 데이터 신선도 의존 | 매일 새 도메인 갱신 필요 |
| 3 | SMTP probing (RCPT TO) | 매우 어려움 | 30~70% | 진짜 본 게임 — 아래 상세 |
| 4 | Catch-all 판별 | 불가능에 가까움 | ML 없이 ~50% | 상용업체의 진짜 해자 |
| 5 | Spam trap 탐지 | 자체 불가 | 0% | 상용 vendor의 독점 DB |
| 항목 | 사양 | 월 USD | 비고 |
|---|---|---|---|
| Verification IP pool | 10~20개 clean IP (PTR · warmup 완료) | $50~$200 | OVH/Hetzner colocation (AWS는 outbound 25 막힘) |
| SOCKS5 outbound proxy | 5~10개 (port 25 우회) | $100~$300 | Reacher 공식 권장 |
| Compute (verifier) | 4 vCPU × 2~4대 | $80~$160 | Rust/Go면 1대로도 가능 |
| DNS resolver | unbound self-host | $20 | NXDOMAIN 캐시 필수 |
| Redis (cache + queue) | 4GB managed | $30~$60 | BullMQ + 결과 캐시 |
| Postgres (결과 영속) | 2 vCPU/4GB | $40~$80 | 30~90일 캐시 |
| Disposable list updater | cron | $0 | github.com/disposable 매일 pull |
| 모니터링 | mxtoolbox / HetrixTools | $30~$50 | Spamhaus 등재 알람 |
| 소계 (인프라) | $350~$870/월 | ||
| 초기 개발 (~200h × $100) | 1회 | $20,000 | senior eng |
| 운영·튜닝 (월 20h × $100) | 매월 | $2,000 | IP delist, on-call |
| TCO 1년차 | $26,000~$30,000 | 100만 건/월 처리 시 단가 ≈ $0.0022/건 | |
| 솔루션 | Public claim | 실측 | 차이 원인 |
|---|---|---|---|
| 자체 SMTP probing only | — | 30~70% | anti-probing 직격 |
| 자체 + disposable + ML 룰 | — | 80~85% | catch-all 추정 불가 |
| Reacher self-host (OSS) | 99% invalid 만 | safe 라벨 bounce ≤3% 보장 | recall/coverage 보장 X |
| ZeroBounce | 99% | 96~97% | 수십억 historical + AI |
| Bouncer | 99.5% | ~97% | catch-all ML |
| MillionVerifier | 99% | ~95% | catch-all 회피 전략 |
| 벤더 | 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년차) | 발송량 ↑ 시만 유리 |
| 시나리오 | 자체 1년차 | 상용 1년차 | Break-even | 권장 |
|---|---|---|---|---|
| 10만/월 (120만/년) | $26,000 | MV $660 / ZB $3,300 | 자체가 40배 비쌈 | 상용 압승 |
| 100만/월 (1,200만/년) | $30,000 | MV $6,600 / ZB $33,000 | 자체 ≈ ZB 수준 | 상용 (정확도+운영 부담) |
| 1,000만/월 (1.2억/년) | $50,000 | MV $48,000 / ZB $240,000 | 자체 ≈ MV | 하이브리드 |
| 1억/월 | $150,000 | MV $480,000 / ZB $2.4M | 자체 압승 | 자체 + 상용 trap DB API |
┌──────────────────────────────────────────────────────────────┐ │ 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 갱신 [자체 학습 루프] │ └──────────────────────────────────────────────────────────────┘
| 시나리오 | naive 상용 | 하이브리드 | 절감률 |
|---|---|---|---|
| 100만 건/월 (MV) | $549 | $549 × 0.7 × 0.3 = $115 | 79% |
| 100만 건/월 (ZB) | $2,750 | $578 | 79% |
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;
}
elysia-server/src/services/email-verification/ 신규. Node dns + email-validator + disposable-email-domains (매일 cron pull). 개발 1주.email_verification_cache 테이블, UUIDv7 PK, keyset cursor, 90일 TTL. bun db:generate로 migration 추가.aws-ses · sendgrid skill의 suppression API 연동.| 도메인 / 이슈 | 동작 / 권장 |
|---|---|
| naver.com | SMTP probing 응답 일관성 낮음. SPF/DKIM/DMARC 체크가 더 신뢰적. catch-all 아님 |
| daum.net / hanmail.net | Kakao 통합 운영. SPF에 Daum mail server 포함. 동일 사용자가 3개 alias 보유 가능 → 중복 dedup 주의 |
| docomo.ne.jp / au.com / softbank.ne.jp | carrier 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. 한글 인터페이스는 어떤 서비스도 제공하지 않음.
| 이슈 | 위험도 | 대응 |
|---|---|---|
| GDPR — 이메일은 PII | 중상 | bulk vendor와 DPA 체결, 30일 내 vendor 삭제 조항. EU 데이터는 EU region vendor |
| 한국 개인정보보호법 | 중상 | 수집 출처·이용 목적 동의, 보관기간, 제3자 제공(vendor) 별도 동의 |
| 정보통신망법 (불법 스팸) | 상 | 광고성 정보 수신 동의 필수, [광고] 표기, 02:00 이후 야간 발송 금지 |
| CFAA (미국) — SMTP probing | 중 | "unauthorized access" 회색지대. 명시적 위법 사례는 없으나 대량 probing은 Gmail/Microsoft TOS 위반 가능 |
| 수신 메일 서버 ToS | 중 | Gmail TOS 상 "bulk address harvesting" 금지 명시. 상용 vendor 사용 시 vendor가 위험 흡수 |
| List leak 사고 (Verifications.io 2019) | 상 | 2019년 vendor가 8.7억 건 평문 leak — vendor의 SOC 2 / ISO 27001 확인 필수 |
| 발송량 | 사용 케이스 | 권장 전략 | 월 비용 |
|---|---|---|---|
| < 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 多) | Bouncer | ZeroBounce Verify+ | Google/M365 deep verify, toxicity |
| 대량 cleaning (1M+) | MyEmailVerifier | DeBounce / MillionVerifier | 1M $399~$549 |
| 엔터프라이즈 (SOC2/Salesforce) | BriteVerify | ZeroBounce | 컴플라이언스 + SF 네이티브 |
| 실시간 API (폼 검증) | Bouncer Shield | ZeroBounce | 낮은 latency, webhook |
| EU 데이터 주권 | Bouncer | Verifalia / DeBounce | EU-only residency |
| 속도 우선 (10K <2분) | Emailable | Bouncer | 0.012초/건 |
| 한국 결제 편의 | MyEmailVerifier | Emailable | Alipay / Apple Pay |
| ZoomInfo 사용 중 | NeverBounce | — | 번들 무료 |
| HubSpot 사용 중 | Kickbox | ZeroBounce | Marketplace 공식 |
| Finder + Verify 통합 | Hunter | Clearout | prospecting 일체화 |
2026년 자체 SMTP probing은 죽었다. 빅3 anti-probing + Spamhaus 등재 메커니즘 + spam trap DB 독점 때문이다. 린다(앱린다)의 현재 단계에서는 상용 API ($0.0005/건) + Postgres 90일 캐시 + bounce 학습 루프만이 ROI가 나오며, 자체 구현은 발송량 월 1000만 건 + 전담 인프라 엔지니어가 있을 때만 검토 가치가 있다.