엔지니어링

이메일 리스트 정제, 목록 절반을 버리는 필터를 기각한 이유

이메일 리스트 정제는 목록을 줄이는 일이 아니라 죽은 메일함만 골라내는 일이었습니다. 반송률 8.3% 때문에 하루 발송 상한이 100통에서 50통으로 깎인 상태에서, 저희는 목록의 48%를 잘라 내는 필터를 먼저 떠올렸습니다. 숫자를 다시 재자 그 필터는 반송을 줄이지 못한다는 사실이 드러났고, 목록 규모는 그대로 두고 반송 주소의 48%를 걸러 내는 검사로 방향을 바꿨습니다.

2026-11-10검색어: 이메일 리스트 정제: 뉴스레터·영업 메일 발송 전 주소 목록을 손보려는 마케팅·영업 담당자가 치는 말시점: 2026년 8월 4일 콜드메일 자동 발송 반송 대책출발 상태: 반송률 8.3%, 하루 발송 상한 100통 → 50통기각한 가설: 공식 주소 대조 필터: 목록 1,876 → 980(-48%), 판정별 반송률 9.8% · 11.7% · 4.9%조치: 발송 직전 SMTP RCPT 확인을 세 번째 필터로 추가, 목록은 깎지 않음재측정: 분류기 판별력 반송군 57%/정상군 10% → 48%/2% → 48%/0% (정상군 60건)한계: 반송률 4%대 복귀는 예상치, 정책 차단 도메인은 판정 불가

이메일 리스트 정제는 왜 다시 문제가 됐나?

이메일 리스트 정제를 '목록을 줄이는 일'로 이해하면, 반송은 그대로 두고 보낼 곳만 잃습니다. 저희는 2026년 8월 4일 콜드메일 반송 대책을 세우면서 목록을 48% 잘라 내는 필터를 거의 채택할 뻔했고, 판정별 반송률을 다시 재고 나서야 그 필터가 반송을 줄이지 못한다는 사실을 확인했습니다. 결국 목록은 깎지 않고, 보내기 직전에 받는 메일 서버에 '이 계정이 있느냐'를 묻는 검사를 세 번째 필터로 넣었습니다.

출발점은 비용이었습니다. 저희 발송 스크립트에는 반송률이 높아지면 다음 날 발송 상한을 절반으로 줄이는 규칙이 들어 있습니다. 메일 서비스들은 반송이 많은 발신 도메인을 스팸 발신자로 의심하기 때문에, 반송을 방치하면 정상 메일까지 받은편지함에 닿지 못합니다. 이 규칙은 그 위험을 막는 안전장치입니다.

2026년 8월 4일 기준 반송률은 8.3%였고, 그 결과 하루 상한은 100통에서 50통으로 내려가 있었습니다. 영업 메일은 보내는 양이 곧 기회의 양이라, 상한 절반은 그대로 영업 기회 절반을 뜻합니다. 반송률을 다시 낮춰 상한을 100통으로 돌리는 일이 이번 작업의 목표였습니다. 원인을 찾는 하루하루가 곧 영업 메일 50통씩의 손실이었습니다.

  • 반송률: 8.3%
  • 하루 발송 상한: 100통 → 50통 (반송률 때문에 자동으로 절반)
  • 발송 시각: 매일 아침 9시 10분 예약 실행
  • 목표: 반송을 줄여 상한을 다시 100통으로 복귀

반송 문제가 처음은 아니었습니다. 2026년 7월 20일에 잰 반송률은 7.2%(125통 중 9통)로, 저희가 위험선으로 잡은 5%를 이미 넘어 있었습니다. 그때 원인 대부분은 폐업이나 도메인 만료로 DNS 자체가 사라진 주소였고, 발송 전에 도메인의 메일 수신 기록(MX 레코드)을 조회해 걸러 내는 필터를 넣었습니다. 그런데 한 달이 채 안 돼 반송률은 오히려 8.3%로 올라 있었습니다.

처음 잰 숫자: 반송 40건 중 32건이 두 필터를 모두 통과했다

이때 발송 직전 방어는 두 층이었습니다. 첫째 층은 앞에서 말한 DNS 조회로, 도메인이 살아 있는지만 봅니다. 둘째 층은 공식 주소 대조 검사로, 그 회사 홈페이지에 공식 연락처로 적힌 주소와 발송 주소가 같은지를 확인합니다. 홈페이지에서 직접 확인한 주소라면 엉뚱한 주소일 리 없다는 생각이 둘째 층의 전제였습니다.

반송된 주소를 이 두 층에 다시 대 보았습니다. 반송 40건 중 32건이 공식 주소 대조 검사에 등재돼 있었고, 신뢰도까지 '높음'으로 매겨져 있었습니다. 도메인은 살아 있고 주소도 홈페이지에 정확히 적혀 있는데, 메일은 돌아왔습니다.

반송 40건을 기존 두 필터에 다시 대 본 결과
항목값
반송 주소 전체40건
공식 주소 대조 등재 + 신뢰도 높음32건
DNS 조회(도메인 생존)두 필터 모두 통과한 주소가 다수
당시 반송률8.3%

2026년 8월 4일 기준. 공식 주소 대조는 회사 홈페이지에 적힌 연락처와 발송 주소를 맞춰 보는 검사.

첫 반응은 둘째 층이 느슨하다는 쪽이었습니다. 대조 결과를 참고만 하지 말고 발송 여부를 가르는 기준으로 쓰면, 즉 '공식 주소로 확인된 곳에만 보낸다'고 못 박으면 반송이 줄 것 같았습니다.

세운 가설: 공식 주소로 확인된 곳에만 보내면 반송이 줄까?

가설은 단순했습니다. 공식 주소 대조 검사는 주소마다 판정을 하나씩 남깁니다. '검증 통과'는 홈페이지 주소와 일치한 경우, '판단불가'는 홈페이지를 읽지 못했거나 대조가 애매한 경우, '미등재'는 그 주소가 홈페이지에서 발견되지 않은 경우입니다. 미등재 주소는 출처가 불분명하니 반송 위험이 크고, 검증 통과 주소만 남기면 반송이 준다는 추론이었습니다.

이 필터를 실제로 걸면 무슨 일이 생기는지 먼저 계산했습니다. 공식 주소 대조 검사의 커버리지, 즉 판정이 붙은 주소 비율은 46%에 그쳤습니다. 검증 통과 주소만 남기면 발송 목록이 1,876곳에서 980곳으로 줄어듭니다. 목록의 48%를 한 번에 잘라 내는 셈입니다.

공식 주소 필터를 걸었을 때의 영향. 발송 목록 1,876곳이 980곳으로 48% 줄고, 공식 주소 대조 커버리지는 46%, 반송 40건 중 32건은 이미 대조를 통과한 주소
목록을 반토막 내는 필터의 비용

목록이 절반으로 줄어도 반송이 그만큼 줄어든다면 남는 장사일 수 있습니다. 하루 상한이 50통인 상황에서 목록이 980곳이면 당장 보낼 곳이 모자라지도 않습니다. 그래서 이 안은 꽤 그럴듯해 보였습니다. 채택 전에 확인할 것은 하나였습니다. 판정별로 실제 반송률이 정말 다른가.

가설이 틀린 지점: 검증 통과 주소가 2배 더 반송했다

발송 기록과 반송 기록을 판정별로 나눠 다시 셌습니다. 결과는 가설과 정반대였습니다. 검증 통과 174건 중 9.8%가 반송됐고, 판단불가 128건은 11.7%였습니다. 가장 반송이 적은 쪽은 미등재 162건으로 4.9%였습니다.

공식 주소 대조 판정별 실제 반송률
검증 통과 (174건)9.8%
판단불가 (128건)11.7%
미등재 (162건)4.9%

2026년 8월 4일, 기존 발송 기록을 판정별로 나눈 관측 비교. 무작위 배정 실험은 아니다.

판정별 반송률 막대. 검증 통과 174건 9.8%, 판단불가 128건 11.7%, 미등재 162건 4.9%
검증 통과 주소가 미등재 주소보다 2배 더 반송했다

검증 통과 주소가 미등재 주소보다 2배 더 반송한 셈입니다. 이 필터를 걸었다면 반송률이 가장 낮은 미등재 162건을 버리고, 반송률이 더 높은 쪽을 남기는 결과였습니다. 목록은 48% 줄고 반송률은 오히려 오를 수 있는 구조였습니다.

이 비교에는 한계가 있습니다. 판정별로 주소를 무작위로 나눠 보낸 실험이 아니라 이미 보낸 기록을 사후에 나눈 관측 비교라서, 표본마다 업종이나 회사 규모 같은 다른 차이가 섞여 있을 수 있습니다. 그래도 필터를 정당화하려면 최소한 '검증 통과 쪽이 덜 반송한다'는 방향은 나와야 합니다. 방향이 반대로 나온 이상, 이 필터를 걸 근거는 성립하지 않았습니다.

목록을 48% 깎는 필터인데, 깎이는 쪽이 오히려 덜 반송했다.

진짜 원인은 무엇이었나: 주소의 출처와 메일함의 생존은 다른 질문

숫자가 거꾸로 나온 이유는 공식 주소 대조 검사가 답하는 질문에 있었습니다. 이 검사는 '이 주소가 그 회사의 공식 주소인가'를 봅니다. 반송을 가르는 질문은 '그 메일함이 지금 살아 있는가'입니다. 두 질문은 겹쳐 보이지만 서로 다른 질문입니다.

홈페이지에 한 번 적힌 연락처는 잘 바뀌지 않습니다. 담당자가 퇴사해 계정을 지웠거나 회사가 메일 서비스를 옮겼어도, 홈페이지의 주소 문구는 몇 년씩 그대로 남아 있곤 합니다. 저희는 이런 주소를 '박제된 주소'라고 불렀습니다. 박제된 주소는 도메인이 살아 있으니 DNS 조회를 통과하고, 홈페이지에 그대로 적혀 있으니 공식 주소 대조도 높은 신뢰도로 통과합니다. 그런데 계정은 이미 없습니다. 반송 40건 중 32건이 바로 이 경우였습니다.

발송 직전 필터 세 층. DNS 조회는 도메인 생존, 공식 주소 대조는 홈페이지 등재 여부, SMTP RCPT 확인은 계정 존재를 본다. 박제된 주소는 앞 두 층을 통과하고 세 번째 층에서만 걸린다
세 층이 각각 묻는 질문

정리하면, 기존 두 필터 모두 메일함의 생존을 직접 묻지 않았습니다. DNS 조회는 도메인 단위의 생존을, 공식 주소 대조는 주소의 출처를 봤습니다. 둘째 층을 더 엄격하게 써도 질문 자체가 바뀌지 않으니 반송은 줄지 않습니다. 필요한 것은 같은 질문을 더 세게 묻는 필터가 아니라, 다른 질문을 묻는 필터였습니다.

조치: 목록을 깎지 않고 받는 서버에 하나씩 묻는다

메일함이 살아 있는지 가장 확실하게 아는 쪽은 그 메일을 받을 서버입니다. 메일은 SMTP라는 규약으로 전달되는데, 보내는 쪽은 받는 서버에 접속해 인사(EHLO), 보내는 사람(MAIL FROM), 받는 사람(RCPT TO)을 차례로 알린 뒤에야 본문(DATA)을 보냅니다. 받는 서버는 RCPT TO 단계에서 그 계정이 없으면 거절 코드를 돌려줍니다.

그래서 발송 직전에 RCPT TO까지만 말하고 연결을 끊는 확인 절차를 만들었습니다. 본문을 보내지 않으므로 실제 메일은 한 통도 나가지 않습니다. 이 확인을 DNS 조회 뒤, 실제 발송 앞에 세 번째 필터로 끼웠습니다. 공식 주소 대조 검사는 그대로 두되 발송 여부를 가르는 기준으로는 쓰지 않기로 했습니다.

  • 첫째 층: DNS 조회: 도메인에 메일 수신 기록이 있는가 (조회 제한 4초)
  • 둘째 층: 공식 주소 대조: 참고 정보로만 남기고 발송을 막지 않음
  • 셋째 층(신규): SMTP RCPT 확인: 받는 서버가 '그런 계정 없다'고 답하는가 (응답 대기 15초)
  • 판정 불가(시간 초과·접속 실패·일시 오류)는 모두 통과시킴

판정 규칙에서 가장 공들인 부분은 '무엇을 반송 확정으로 볼 것인가'였습니다. 거절 코드가 5xx라고 다 같은 의미가 아닙니다. 그래서 계정 부재를 명시한 문구가 있고, 동시에 정책 차단 문구가 없을 때만 반송 확정으로 판정했습니다. 그 밖의 응답은 전부 통과입니다.

RCPT 응답 분류 함수. 5xx이면서 계정 부재 문구가 있고 정책 차단 문구가 없을 때만 reject, 400 미만이면 ok, 나머지는 unknown
반송 확정은 '계정 없음'을 명시한 5xx뿐

판정이 애매할 때 통과시키는 이유는 비용의 비대칭 때문입니다. 살아 있는 주소를 반송으로 잘못 판정하면 그 리드는 목록에서 영구히 사라집니다. 반송 1건은 반송률을 조금 올릴 뿐입니다. 일시 장애로 정상 리드를 버리는 손해가 반송 1건보다 크다고 보고, 확실한 거절만 막는 쪽을 택했습니다.

처리 시간도 따져 봤습니다. 주소마다 받는 서버에 접속해야 하니 발송 직전에 왕복이 하나 더 생깁니다. 동시에 6건씩 확인하도록 설정했고, 하루 상한 100통 기준으로 1분 안에 끝나는 수준입니다. 회사 네트워크나 일부 클라우드처럼 25번 포트가 막힌 환경에서는 모든 결과가 판정 불가로 나와 시간만 쓰기 때문에, 환경 변수 하나로 이 필터를 통째로 끌 수 있게 했습니다.

검토하고 버린 안도 두 가지 더 있었습니다. 하나는 상용 이메일 검증 API입니다. 같은 신호를 자체 RCPT 확인으로 얻을 수 있는데 매달 고정비가 새로 생기므로 기각했습니다. 다른 하나는 메일 제목의 광고 표기를 바꿔 스팸 필터를 피하자는 안이었습니다. 제목 맨 앞의 '(광고)'는 정보통신망법 제50조 제4항이 정한 법정 표기라 임의로 바꿀 수 없어 이것도 기각했습니다.

재측정 결과: 판별력을 세 번 재고 나서야 숫자를 믿었다

필터를 넣었다고 끝이 아니었습니다. 이 필터가 반송 주소와 정상 주소를 실제로 구분하는지 재야 했습니다. 이미 반송이 확인된 주소 묶음(반송군)과, 반송 없이 정상 도착한 주소 묶음(정상군)에 RCPT 확인을 돌려 각각 몇 %가 막히는지 셌습니다. 정상군은 수신거부 주소를 뺀 60건이었습니다. 좋은 필터라면 반송군은 많이, 정상군은 거의 막지 않아야 합니다.

첫 측정 결과는 반송군 57% 차단, 정상군 10% 차단이었습니다. 반송군을 절반 넘게 막으니 쓸 만해 보였지만, 정상 주소를 10%나 막는다는 점이 걸렸습니다. 정상군에서 막힌 주소를 하나씩 열어 보다가 함정을 찾았습니다.

실제로 저희에게 회신까지 보낸 살아 있는 리드의 주소가 '550 5.7.1 … blocked using Spamhaus'로 거절돼 있었습니다. 이 응답은 계정이 없다는 뜻이 아니라, 확인하러 간 우리 컴퓨터의 IP가 차단됐다는 뜻입니다. 확인 작업을 돌린 PC가 가정용 회선이라 스팸 차단 목록인 Spamhaus에 올라 있었습니다. 실제 메일은 Resend의 IP로 나가므로 발송 자체와는 상관이 없지만, 첫 분류기는 이 응답을 계정 부재로 읽고 있었습니다.

그래서 응답 문구로 정책 차단을 따로 가려내도록 분류기를 고쳤습니다. 'spamhaus', 'blocked', 'policy', '5.7.' 같은 문구가 섞이면 계정 유무를 알 수 없다고 보고 통과시킵니다. 다시 재자 반송군 48%, 정상군 2%가 나왔고, 분류 규칙을 한 번 더 재구성한 뒤 정상군 오차단은 0%가 됐습니다.

RCPT 필터 판별력: 세 차례 측정
측정반송군 차단정상군 오차단바뀐 점
1차 (초판 분류기)57%10%5xx를 모두 계정 부재로 판정
2차 (정책 차단 분리)48%2%Spamhaus·5.7.x 문구는 판정 불가로 통과
3차 (재구성 후)48%0%정상군 60건 기준, 수신거부 주소 제외

반송군 = 이미 반송이 확인된 주소, 정상군 = 정상 도착한 주소. 2026년 8월 4일 실측.

판별력 세 차례 측정. 1차 반송군 57% 정상군 10%, 2차 48%와 2%, 3차 48%와 0%
반송군 차단은 57%에서 48%로 내려갔지만, 정상군 오차단이 10%에서 0%로 사라졌다

눈여겨볼 점은 숫자가 '나빠진' 방향입니다. 반송군 차단율은 57%에서 48%로 떨어졌습니다. 첫 측정의 57%는 정책 차단까지 반송으로 센 탓에 부풀어 있었고, 정상군 10%도 같은 이유로 부풀어 있었습니다. 양쪽 다 틀린 숫자였던 셈입니다. 한 번만 재고 끝냈다면 57%라는 숫자를 들고 정상 리드의 10%를 버리는 필터를 그대로 운영할 뻔했습니다.

이 함정이 다시 생기지 않도록 회귀 테스트 9건을 만들었습니다. 케이스는 모두 그날 실제 받은 서버 응답 문구입니다. 계정 부재 문구 4종(505 'unknown user (#5.5.1)' 두 건, 550 '5.1.1 User unknown', 550 'no mailbox here'), 정책 차단 2종(Spamhaus 실측 응답, 계정 문구와 정책 문구가 섞인 응답), 정상 수락 250, 그레이리스팅 450, 일시 오류 421입니다. 분류 규칙을 고치다가 정책 차단을 다시 반송으로 읽게 되면 이 테스트가 바로 깨집니다.

공식 주소 필터와 비교하면 차이가 분명합니다. 공식 주소 필터는 목록을 1,876곳에서 980곳으로 깎으면서 반송률이 오히려 높은 쪽을 남겼습니다. RCPT 필터는 판정 불가를 모두 통과시키므로 목록 규모를 거의 건드리지 않고, 공식 주소 대조의 커버리지 46%와도 상관없이 모든 주소에 작동합니다.

남는 한계: 8.3%에서 4%대로의 복귀는 아직 예상치다

가장 먼저 밝혀 둘 한계는 재측정의 범위입니다. 이 글에서 잰 것은 필터의 판별력이지 운영 반송률이 아닙니다. 반송군의 48%를 막는다는 판별력에서 계산하면 반송률은 8.3%에서 4%대로 내려가고, 그러면 상한 규칙도 50통에서 100통으로 돌아갑니다. 다만 이 수치는 필터를 배포한 2026년 8월 4일 시점의 예상이고, 이 글의 자료에는 배포 뒤 실제 반송률이 없습니다.

두 번째 한계는 구조적입니다. 확인 작업을 돌리는 회선이 Spamhaus에 등재돼 있는 한, Outlook이나 Proofpoint 계열 메일 서버는 RCPT 확인에 5.7.1 정책 거절을 돌려줍니다. 그 도메인들은 항상 판정 불가로 통과하므로 이 필터가 걸리지 않습니다. 반송군 차단율이 48%에서 멈춘 이유 중 하나가 여기에 있습니다.

세 번째는 catch-all 서버입니다. 없는 주소에도 250으로 '받겠다'고 답하는 서버가 있어서, 정상 수락이 계정 존재의 증명은 아닙니다. RCPT 확인은 '확실히 없다'만 가려낼 수 있고, '확실히 있다'는 말해 주지 못합니다.

  • 운영 반송률 4%대는 예상치, 배포 후 실측 필요
  • Spamhaus 등재 회선에서는 Outlook·Proofpoint 계열 판정 불가
  • catch-all 서버는 없는 주소도 250으로 수락
  • 판별력 측정은 관측 비교, 정상군 60건 규모

같은 교훈은 며칠 뒤 다른 필터에서도 반복됐습니다. 네이버·한메일·Gmail 같은 무료 메일 도메인을 막는 필터가 있었는데, 그 근거는 반송 실측이 아니라 '개인 계정은 도달률이 낮을 것'이라는 가설이었습니다. 이 한 줄이 발송 가능한 대상을 14,107곳 중 206곳(1.5%)으로 묶고 있었고, 2026년 8월 9일에 차단을 풀자 206곳에서 1,883곳으로 9.1배 늘었습니다. 대신 무료 도메인 여부를 발송 기록에 표시만 해 두어, 가설이 맞는지 나중에 반송률로 비교할 수 있게 했습니다.

이메일 리스트를 정제하기 전에 무엇부터 재야 하나?

이번 일에서 얻은 순서는 이렇습니다. 첫째, 필터를 걸기 전에 그 필터의 판정별 실제 반송률을 먼저 잽니다. 판정 A가 판정 B보다 덜 반송한다는 방향이 확인되지 않으면, 그 필터는 목록만 줄입니다. 저희의 경우 검증 통과 9.8%, 미등재 4.9%로 방향부터 거꾸로였습니다.

둘째, 필터가 실제로 묻는 질문을 한 문장으로 적어 봅니다. '공식 주소인가'와 '메일함이 살아 있는가'는 다른 질문입니다. 반송을 줄이고 싶다면 메일함의 생존을 묻는 필터가 필요합니다. 셋째, 필터의 판별력은 반송군과 정상군 양쪽에서 재고, 정상군 오차단을 반드시 함께 봅니다. 저희 첫 측정 57%/10%처럼 양쪽이 같이 부푼 숫자는 한쪽만 봐서는 드러나지 않습니다.

받는 서버의 거절 문구를 계정 없음과 정책 차단으로 가르는 방법은 SMTP 550 5.7.1 거절을 계정 없음으로 읽으면 생기는 일에서 더 자세히 다뤘습니다. 영업 메일 발송 목록 정리나 반송 자동 점검을 직접 꾸리기 어렵다면 상담으로 현재 반송 기록을 보내 주셔도 됩니다.

같은 방식으로 우리 업무를 재보고 싶다면

이 글에 쓴 계측·판정·자동화는 저희가 실제로 매일 돌리는 방식 그대로입니다. 어떤 작업을 자동화할 수 있고 어디를 사람이 잡아야 하는지, 현재 업무 흐름을 놓고 같이 짚어 드립니다.

새 글이 올라오면 알려 드립니다

이런 계측 기록을 새로 쓰면 메일로 한 통 보냅니다. 광고나 판촉은 보내지 않습니다.