엔지니어링

콜드메일 반송률, 공식 주소만 보내면 줄까: 판정별 실측으로 기각하다

콜드메일 반송률은 홈페이지에 적힌 공식 주소만 골라 보내는 방식으로는 줄지 않았다. 공식 주소로 확인한 주소가 확인 못 한 주소보다 2배 더 반송했기 때문이다. 반송을 줄인 건 받는 서버에 그 계정이 지금 있는지 직접 묻는 검사였다.

2026-11-09결정 시점: 2026년 8월 4일, 다음 날 오전 9시 10분 정기 발송부터 적용출발 상태: 반송률 8.3%, 하루 발송 상한 100통 → 50통관측: 반송 40건 중 32건이 공식 주소 대조에서 '신뢰도 높음'으로 통과판정별 반송률: 검증 통과 174건 중 9.8% · 판단불가 128건 중 11.7% · 미등재 162건 중 4.9%기각한 안: 공식 주소만 보내면 발송 대상 1,876곳 → 980곳(-48%), 반송은 그대로조치: 발송 직전 SMTP RCPT 확인을 셋째 검사로 추가(응답 대기 15초·동시 6개)재측정(지난 주소 대상): 초판 반송군 57%/대조군 10% → 수정 후 반송군 48%/대조군 0%(수신거부 제외 60건)한계: 배포 뒤 실제 반송률은 근거 자료에 없음, Outlook·Proofpoint 계열은 판정 불가

콜드메일 반송률은 무엇을 망가뜨리고 있었나?

콜드메일 반송률은 홈페이지에 적힌 공식 주소만 골라 보내는 방식으로는 줄지 않았다. 공식 주소로 확인한 주소의 반송률이 9.8%, 확인하지 못한 주소의 반송률이 4.9%로, 오히려 확인한 쪽이 2배 더 반송했다. 이 글은 그 숫자를 재기 전까지 우리가 믿었던 가설과, 그 가설을 접고 실제로 바꾼 검사 한 층을 순서대로 적은 기록이다.

출발점은 반송률 8.3%였다. 발송 스크립트에는 반송률이 높으면 하루 발송 상한을 절반으로 줄이는 규칙이 들어 있고, 이 규칙이 상한을 100통에서 50통으로 깎고 있었다. 규칙은 제 할 일을 했다. 반송이 쌓이면 받는 쪽 메일 서비스가 발송 도메인을 의심하기 시작하고, 그때부터는 멀쩡한 주소로 보낸 메일도 받은편지함에 닿지 못한다. 도메인 평판은 한 번 무너지면 되살리기 어렵다.

영업 메일을 매일 보내는 작은 회사에서 하루 상한이 절반으로 줄면 영업 접점도 절반으로 준다. 같은 문안을 같은 대상에게 보내도 닿는 회사 수가 반이면, 제목이나 본문을 바꿔 보는 실험도 결과가 나오기까지 두 배를 기다려야 한다. 그래서 반송률은 품질 지표 하나가 아니라 영업 속도 전체를 붙잡는 병목이었다.

반송과 싸운 게 처음은 아니었다. 2026년 7월 20일에도 반송률이 7.2%(125통 중 9통)까지 올라 흔히 위험선으로 보는 5%를 넘겼다. 그때 원인은 대부분 폐업했거나 도메인이 만료돼 DNS 자체가 사라진 주소였다. 그래서 발송 전에 도메인의 메일 수신 레코드(MX, 없으면 A 레코드)를 조회해 확정 부재만 거르는 검사를 넣었다. 조회 대기는 4.0초로 묶었고, 판정이 안 나면 통과시켰다. 일시 장애 때문에 정상 주소를 영구히 버리는 손해가 반송 1건보다 크다고 봤기 때문이다.

그 위에 한 층을 더 얹었다. 회사 홈페이지를 읽어, 보내려는 주소가 홈페이지에 적힌 공식 연락처인지 대조하는 검사다. 다른 회사 받은편지함으로 메일이 잘못 가는 사고를 막으려는 장치였고, 대조 결과마다 '신뢰도 높음' 같은 등급을 붙였다. 도메인이 살아 있는지 보는 층과 공식 주소인지 보는 층, 두 겹이면 반송 대부분을 거를 수 있다고 생각했다. 그런데 반송률은 8.3%에 머물렀다.

처음 잰 숫자: 반송 40건 중 32건이 두 검사를 다 통과했다

먼저 반송된 주소 40건을 하나씩 공식 주소 대조 결과와 맞춰 봤다. 방법은 단순했다. 메일 발송 서비스가 돌려준 반송 목록과 발송 전에 붙여 둔 대조 등급을 주소 단위로 이어 붙였다. 결과는 40건 중 32건이 공식 주소로 등재돼 있었고, 등급도 '신뢰도 높음'이었다.

출발 상태. 반송률 8.3%, 하루 발송 상한 100통에서 50통으로 축소, 반송 40건 중 32건이 공식 주소 대조 통과, 대조 판정 범위 46%
처음 잰 숫자: 반송 대부분이 기존 검사 두 겹을 모두 통과했다

도메인은 살아 있었고 홈페이지에도 그 주소가 적혀 있었다. 그런데 메일을 보내면 받는 서버가 그런 계정이 없다고 답했다. 홈페이지에 한 번 적힌 주소가 수정되지 않은 채 남아 있고, 실제 계정은 이미 폐기된 경우다. 담당자가 퇴사했거나 회사가 메일 서비스를 옮겼을 때 흔히 생긴다.

다만 이 숫자 하나로 결론을 내릴 수는 없었다. 반송된 주소만 봐서는, 애초에 보낸 주소 가운데 공식 주소가 얼마나 많았는지 모른다. 보낸 주소 대부분이 공식 주소였다면 반송도 공식 주소에서 많이 나오는 게 자연스럽다. 반송 쪽만 들여다보는 분석은 분모를 빠뜨린다.

이 시점에 손에 쥔 숫자는 네 개였다. 반송률 8.3%, 하루 상한 50통(원래 100통), 반송 40건 중 32건이 대조 통과, 그리고 공식 주소 대조가 판정을 내린 범위가 전체 대상의 46%라는 사실이다. 마지막 숫자는 대조 검사가 대상의 절반 넘게는 아무 말도 하지 못한다는 뜻이기도 했다.

세운 가설: 공식 주소에만 보내면 반송이 줄어든다

처음 떠오른 안은 공식 주소 대조를 지금처럼 등급만 붙이는 참고 정보로 두지 말고, 아예 발송을 막는 조건으로 바꾸자는 것이었다. 홈페이지에서 확인한 주소만 보내고, 확인 못 한 주소는 발송 대상에서 뺀다. 공식으로 확인한 주소가 확인 못 한 주소보다 살아 있을 확률이 높을 거라는 직관에 기댄 안이다.

홈페이지에서 공식 주소로 확인한 곳에만 보내면 반송률이 내려가고, 하루 상한도 100통으로 돌아온다.

비용은 분명했다. 공식 주소 대조가 판정을 내린 범위가 46%뿐이라, 이 조건을 걸면 발송 대상이 1,876곳에서 980곳으로 줄어든다. 48%가 한 번에 빠진다. 그래도 처음에는 감수할 만하다고 봤다. 대상이 절반으로 줄어도 반송률이 내려가 하루 상한이 다시 100통이 되면, 하루에 실제로 나가는 메일 수는 비슷하게 유지할 수 있다는 계산이었다.

이 가설에는 확인하지 않은 전제가 하나 숨어 있었다. '공식 주소다'와 '지금 메일을 받는다'가 같은 방향으로 움직인다는 전제다. 앞의 40건 중 32건이라는 관측은 이미 이 전제를 의심하라고 말하고 있었지만, 분모가 없어 확신할 수 없었다. 그래서 차단 조건을 걸기 전에 판정별 반송률을 먼저 재기로 했다.

가설은 어디서 틀렸나?

이번에는 반송된 주소가 아니라 보낸 주소 전체를 대조 판정별로 나누고, 판정마다 실제 반송률을 냈다. 판정은 세 갈래다. 홈페이지에서 공식 주소로 확인한 '검증 통과', 홈페이지는 읽었지만 판단을 내리지 못한 '판단불가', 대조 결과가 아예 없는 '미등재'다.

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

분모는 판정별 발송 수. 무작위 배정이 아닌 관측 비교

결과는 가설과 정반대였다. 검증 통과 174건의 반송률은 9.8%, 판단불가 128건은 11.7%, 미등재 162건은 4.9%였다. 가장 깨끗할 거라 믿었던 검증 통과군이 미등재군보다 2배 더 반송했다. 공식 주소만 남기는 조건을 걸었다면 반송률이 가장 낮은 무리를 통째로 버리고, 반송률이 더 높은 무리만 남겼을 터였다.

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

이 비교에는 한계가 있다. 주소를 무작위로 나눠 보낸 실험이 아니라, 이미 보낸 결과를 판정별로 나눠 본 관측이다. 미등재군에 원래 반송이 적은 종류의 회사가 몰려 있었을 수도 있다. 그래서 '미등재가 더 안전하다'고 결론 내리지는 않았다. 하지만 방향이 반대로 나온 이상, '공식 주소일수록 덜 반송한다'는 가설은 차단 조건의 근거가 될 수 없었다.

공식 주소만 보내는 조건을 걸었을 때
항목조건 전조건 후
발송 대상1,876곳980곳 (-48%)
대상에 남는 판정검증 통과·판단불가·미등재검증 통과만
남는 무리의 반송률판정별 4.9%~11.7%9.8%

정리하면 이 조건은 대상의 48%를 잘라 내면서 반송은 줄이지 못하는 안이었다. 이 안은 기각했다. 처음 직관이 틀렸다는 사실은 숫자 하나를 제대로 나눠 재는 순간 드러났고, 그 전까지는 그럴듯해 보였다.

진짜 원인: 공식 주소인지와 메일함이 살아 있는지는 다른 질문이다

숫자가 뒤집힌 이유는 검사가 묻는 질문에 있었다. 공식 주소 대조는 '이 주소가 이 회사의 공식 연락처인가'를 묻는다. 반송은 '그 메일함이 지금 메일을 받는가'의 문제다. 홈페이지에 몇 년째 걸려 있는 주소는 첫 질문에는 완벽하게 '예'라고 답하지만, 둘째 질문에는 아무 정보도 주지 않는다. 오히려 오래 걸려 있었다는 사실 자체가 그 계정이 방치됐을 가능성을 높인다.

DNS 조회도 같은 처지다. 도메인에 메일 수신 레코드가 있는지만 보므로, 회사가 살아 있고 도메인이 유지되는 한 개별 계정이 폐기돼도 통과한다. 결국 기존 두 겹은 각자 다른 질문에 답하고 있었고, 반송을 일으키는 그 질문에 답하는 층은 하나도 없었다.

각 검사가 실제로 묻는 질문
검사묻는 질문폐기된 계정을 거르나
DNS(MX·A 레코드) 조회도메인이 메일을 받을 수 있나못 거른다(도메인은 살아 있다)
공식 주소 대조홈페이지에 적힌 공식 주소인가못 거른다(홈페이지에 남아 있다)
받는 서버에 계정 확인(SMTP RCPT)그 서버에 이 계정이 있나거른다(서버가 계정 없음을 답할 때)

돌아보면 같은 실수가 다른 검사에도 있었다. 발송 스크립트에는 네이버·한메일·Gmail 같은 무료 메일 도메인 주소를 막는 조건이 걸려 있었는데, 그 근거는 반송 실측이 아니라 '개인 계정은 도달률이 낮을 것'이라는 가설이었다. 이 조건 하나가 발송 가능한 대상을 14,107곳 중 206건(1.5%)으로 묶고 있었고, 2026년 8월 9일 해제하자 1,883건(9.1배)으로 늘었다. 해제하면서 무료·회사 도메인을 라벨로 남겨, 가설이 맞았는지 나중에 반송률로 비교할 수 있게 했다. 검사를 하나 걸 때는 그 검사가 실측에서 나왔는지, 직관에서 나왔는지부터 적어 두는 편이 안전하다.

그렇다고 공식 주소 대조가 쓸모없다는 뜻은 아니다. 이 검사의 본래 목적은 엉뚱한 회사 받은편지함으로 메일이 가는 사고를 막는 데 있고, 그 역할은 여전히 유효하다. 문제는 이 검사를 반송 대책으로 읽으려 한 데 있었다. 도구가 답하는 질문과 우리가 풀려던 질문이 어긋나 있었다.

조치: 발송 직전에 받는 서버에 계정 유무를 묻는다

반송을 일으키는 질문에 직접 답하는 방법은 받는 서버에 물어보는 것이다. 메일 전송 규약(SMTP)에서는 메일 본문을 보내기 전에 받는 사람 주소를 먼저 알리는 RCPT TO 단계가 있고, 서버는 여기서 그 계정을 받을 수 있는지 응답 코드로 답한다. 이 단계까지만 말하고 연결을 끊으면 메일은 한 통도 나가지 않는다.

  • 도메인의 MX 레코드로 받는 서버 주소를 찾고, 25번 포트로 접속한다
  • 인사(EHLO)와 보내는 사람(MAIL FROM)을 알린 뒤 받는 사람(RCPT TO)까지만 말한다
  • 본문(DATA)은 보내지 않고 연결을 끊는다. 메일은 한 통도 나가지 않는다
  • 응답 대기는 15초로 묶고, 넘기면 판정 불가로 보고 통과시킨다
  • 동시에 6개 주소를 확인한다. 하루 상한 100통 기준 1분 안에 끝난다

이 확인을 DNS 조회 뒤, 실제 발송 직전에 셋째 검사로 넣었다. 판정은 세 가지뿐이다. 서버가 계정 없음을 분명히 밝힌 경우만 '거절'로 보고 발송에서 빼고, 정상 응답은 '통과', 나머지는 전부 '판정 불가'로 보고 통과시킨다. 일시적 거절(4xx, 흔히 그레이리스팅)이나 접속 실패, 시간 초과를 막는 쪽으로 판정하면 정상 주소를 영구히 버리게 된다는 이유에서다.

발송 직전 주소 검사 3단 흐름. DNS 조회, 공식 주소 대조, SMTP RCPT 확인 순서이며 계정 없음이 명시된 5xx만 제외
발송 직전 주소 검사 3단: 셋째 층만 반송을 일으키는 질문에 답한다

한 가지 짚어 둘 점이 있다. 일부 서버는 없는 주소에도 정상 응답을 주는 이른바 catch-all 설정을 쓴다. 그래서 '통과'는 계정이 있다는 증명이 아니다. 이 검사가 확실히 할 수 있는 일은 '없다고 밝힌 주소를 빼는 것' 하나다. 기대치를 처음부터 거기에 맞췄다.

다른 대안도 검토했다. 유료 이메일 검증 서비스는 매달 고정비가 새로 생기는데, 직접 RCPT를 확인하면 같은 신호를 얻을 수 있어 접었다. 제목의 광고 표기를 바꿔 스팸 필터를 피하자는 안도 나왔지만, 제목 맨 앞의 '(광고)'는 정보통신망법 §50④가 정한 법정 표기라 임의로 바꿀 수 없어 접었다.

받는 서버의 5xx 응답은 왜 그대로 믿으면 안 되나?

SMTP에서 5로 시작하는 응답은 영구 거절이다. 첫 판 분류기는 이 규칙을 그대로 따라 5xx가 오면 전부 계정 없음으로 판정했다. 이 판에서 지난 발송 주소를 다시 돌려 보니 반송군의 57%를 걸렀다. 숫자만 보면 좋아 보였다. 그런데 반송이 없던 대조군에서도 10%를 막았다. 멀쩡한 주소 10곳 중 1곳을 영구히 버리는 분류기였다.

원인은 실제 응답 문구에 있었다. 우리에게 실제로 회신까지 보낸 살아 있는 연락처가 `550 5.7.1 ... blocked using Spamhaus`로 거절됐다. 계정이 없다는 뜻이 아니라, 확인하러 접속한 쪽의 IP가 스팸 차단 목록(Spamhaus)에 올라 있어 막혔다는 뜻이다. 확인을 돌린 PC가 가정용 회선이었다. 실제 발송은 메일 발송 서비스의 IP로 나가므로 발송 자체와는 상관이 없었지만, 확인 단계에서는 이 차이가 판정을 망쳤다.

RCPT 응답 분류기 변경 전후 코드. 초판은 5xx를 모두 거절로 판정, 수정본은 계정 없음 문구가 있고 정책 차단 문구가 없을 때만 거절
5xx를 코드가 아니라 문구로 가른다

그래서 5xx를 문구로 다시 갈랐다. 정규식을 두 개 뒀다. 하나는 'unknown user', 'user unknown', 'no such user', '5.1.1', '5.5.1'처럼 계정이 없다고 밝힌 문구를 잡고, 다른 하나는 'spamhaus', 'blocked', 'policy', 'reputation', '5.7.'처럼 정책 차단을 뜻하는 문구를 잡는다. 계정 없음 문구가 있고 정책 차단 문구가 없을 때만 '거절'로 본다.

이 함정과 분류기 수정 과정은 SMTP 550 5.7.1 거절이 계정 없음이 아닌 이유에 더 자세히 적어 두었다. 이 글에서 중요한 점은, 첫 판의 57%와 10%가 양쪽 다 부풀려진 숫자였다는 사실이다. 거르는 비율이 높게 나왔다고 좋은 분류기가 아니었다.

재측정 결과: 반송군 48% 차단, 정상 주소 오차단 0%

문구로 정책 차단을 분리한 뒤 같은 방식으로 다시 쟀다. 지난 발송에서 실제로 반송된 주소 무리(반송군)와 반송 없이 도착한 주소 무리(대조군)를 다시 RCPT 확인에 넣고, 각 무리에서 몇 %가 '거절'로 걸리는지 봤다. 분리 직후에는 반송군 48%, 대조군 2%였고, 대조군을 다시 구성한 뒤에는 대조군 오차단이 0%가 됐다. 이 0%는 수신거부 주소를 제외한 60건 기준이다.

분류기별 판별력 비교. 초판 반송군 57% 대조군 10%, 문구 분리 후 반송군 48% 대조군 2%, 대조군 재구성 후 대조군 0%
재측정: 거르는 비율은 줄었지만 정상 주소를 막지 않게 됐다
분류기 판별력 전후
단계반송군 차단대조군 오차단
초판 (5xx 전부 거절)57%10%
문구로 정책 차단 분리48%2%
대조군 재구성 후48%0% (수신거부 제외 60건 기준)

반송군을 거르는 비율은 57%에서 48%로 내려갔다. 대신 정상 주소를 막는 비율이 10%에서 0%로 내려갔다. 발송 쪽에서는 뒤쪽이 훨씬 중요하다. 반송 주소를 하나 놓치면 반송 1건이 생기지만, 정상 주소를 하나 막으면 그 회사에는 다시는 연락하지 않는다.

이 판단을 고정하려고 회귀 테스트 9케이스를 만들었다. 전부 실제로 받은 서버 응답 문구를 그대로 넣었다. 계정 없음 문구, Spamhaus 정책 차단 문구, 일시 거절 등이 각각 기대한 판정으로 나오는지 확인한다. 나중에 누군가 정규식을 손대도 이 9케이스가 같은 실수를 막는다. 테스트는 네트워크 없이 도는 순수 함수만 검사하므로, 받는 서버 상태와 상관없이 언제 돌려도 같은 결과가 나온다.

기대 효과는 이렇게 잡았다. 반송군의 48%를 발송 전에 빼면 반송률이 8.3%에서 4%대로 내려갈 것으로 예상했고, 그러면 하루 상한이 50통에서 100통으로 돌아온다. 이 변경은 2026년 8월 4일에 반영해 다음 날 오전 9시 10분 정기 발송부터 적용했다. 공식 주소 대조의 판정 범위(46%)와 무관하게 모든 주소에 작동하므로 발송 대상도 1,876곳 그대로 유지한다.

여기서 분명히 해 둘 점이 있다. 반송률 4%대는 지난 주소로 잰 판별력에서 끌어낸 예상치다. 이 글의 근거 자료에는 배포 뒤 실제 반송률이 들어 있지 않다. 재측정은 '분류기가 반송 주소와 정상 주소를 얼마나 잘 가르는가'까지이고, '실제 반송률이 몇 %로 내려갔는가'는 아직 확인하지 못한 숫자다.

남는 한계: 이 검사가 못 거르는 콜드메일 반송은 무엇인가?

가장 큰 한계는 확인을 돌리는 IP다. 가정용 회선 IP가 Spamhaus에 올라 있어, Outlook이나 Proofpoint 계열 서버는 계정 유무를 답하기 전에 5.7.1 정책 거절부터 돌려준다. 분류기는 이 응답을 '판정 불가'로 통과시키므로, 이 계열 도메인에는 셋째 검사가 아예 걸리지 않는다. 오차단을 0%로 만든 대가로 커버리지가 구조적으로 좁아졌다.

  • Outlook·Proofpoint 계열은 정책 거절이 먼저 와서 항상 판정 불가로 통과한다
  • catch-all 서버는 없는 주소에도 정상 응답을 주므로 '통과'가 존재 증명이 아니다
  • 25번 포트가 막힌 환경(일부 클라우드·통신사)에서는 전 건이 판정 불가라, 환경 변수 하나로 검사를 통째로 끌 수 있게 했다
  • 발송 직전에 서버 왕복이 하나 늘어난다. 동시 6개로 하루 상한 100통 기준 1분 안

반송군 48%를 걸렀다는 말은 뒤집으면 반송 주소의 절반 남짓은 여전히 이 검사를 통과한다는 뜻이다. 남은 반송 가운데 얼마가 위 계열 도메인에서 나오는지는 따로 나눠 재지 않았다. 다음에 잴 숫자는 두 개다. 배포 뒤 실제 반송률, 그리고 판정 불가로 통과한 주소의 반송률이다.

콜드메일 반송률이 높아 발송량이 묶였다면 먼저 지금 쓰는 검사가 어떤 질문에 답하는지 적어 보길 권한다. 공식 주소인지, 도메인이 사는지, 메일함이 사는지는 서로 다른 질문이다. 그리고 차단 조건을 걸기 전에 판정별 반송률을 분모까지 넣어 한 번 재 보면, 우리처럼 직관과 반대 방향의 숫자가 나올 수 있다. 영업 메일 발송 구조나 업무 자동화를 비슷하게 손보고 있다면 상담으로 문의할 수 있다.

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

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

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

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