개발 2026.08.16

4주 만에 회사 메일함을 열었더니

결제 자동발송 배선을 깔아두고 받은편지함을 4주 동안 한 번도 열지 않았다. 열어보니 손님은 한 명도 없었고, 대신 계정이 잠기기 직전인 통지들이 묻혀 있었다.

회사 메일 계정을 만든 지 4주가 지났다. 결제가 들어오면 구매자에게 시리얼을 자동으로 보내는 배선을 깔아두고, 그 계정을 한 번도 열어보지 않았다.

오늘 열었다. 51통이 있었고 31통이 안 읽음이었다.

손님은 한 명도 없었다

받은 편지를 전수로 훑었다. 스팸함까지 봤다. 결과는 이랬다.

  • 구매자 문의 — 0건
  • 환불 요구 — 0건
  • 사람이 보낸 편지 — 0통

전부 자동 알림이었다. 인스타그램 팔로우 제안, Kaggle 노트북 완료, 페이스북 보안 코드, 결제 플랫폼 온보딩 안내. 스팸함에 한 통 있었는데 투자 사기였다.

4주를 안 봤는데 놓친 손님이 없었다. 안도해야 할 일인지 아픈 일인지 잠깐 헷갈렸다. 팔린 게 없으니 물어볼 사람도 없었던 것이다.

그런데 그 51통 안에 다른 게 묻혀 있었다.

08-11  YouTube   동영상 차단됨
08-05  Instagram 계속 사용하려면 계정을 인증하세요

유튜브가 동영상을 막은 지 5일, 인스타그램이 계정 인증을 요구한 지 11일이 지나 있었다. 방치하면 계정이 잠기는 것들이다. 아무도 몰랐다.

받은편지함의 값은 「손님」이 아니라 「플랫폼이 나에게 요구하는 조치」였다. 그게 조용히 쌓이고 있었다.

감시기를 만들 때 정한 두 가지

사람이 매일 열어보게 하는 건 답이 아니다. 4주를 안 열어본 사람이 내일부터 매일 열 리 없다. 그래서 한 시간에 한 번 우편함을 들여다보는 감시기를 붙였다.

만들면서 두 가지를 원칙으로 잡았다.

첫째, 헤더만 읽는다. 보낸사람·제목·날짜만 가져오고 본문은 아예 가져오지 않는다. 그러면 인증번호가 내 기계에 남지 않고, 메일 본문에 심어놓은 지시문 같은 것도 구조적으로 들어올 수 없다. 규칙으로 막은 게 아니라 못 하게 만든 것이다.

둘째, 읽음 표시를 건드리지 않는다. 나중에 내가 열었을 때 「이미 읽음」으로 보이면 안 되니까. 본 편지는 내 쪽에 번호로만 기억한다.

첫 판은 51통에서 6건을 골라냈는데 셋이 오탐이었다. 「2단계 인증이 사용 설정됨」을 조치가 필요한 것으로 읽었고, 내가 나에게 보낸 배선 시험 메일도 잡았다. 규칙을 두 줄 더해서 4건으로 줄였다.

여기서 순서 하나가 중요했다. 「막힘」을 「완료 통지」보다 먼저 본다. 「동영상 차단됨」은 문장 꼴이 통지문인데 조치가 필요하다. 순서를 반대로 두면 가장 중요한 편지가 조용히 걸러진다.

도메인 메일을 세우면서 세 번 틀렸다

@icenovel.com으로 받고 보내려고 DNS를 옮겼다. 세 군데서 막혔고, 셋 다 내가 잘못 짚은 곳이었다.

하나. 네이버는 구글의 접속을 막는다. 지메일의 「다른 계정에서 메일 가져오기」로 네이버 메일을 끌어오려 했는데 계속 「비밀번호가 올바르지 않습니다」가 나왔다. 비밀번호를 두 번 새로 만들었다. 그러다 네이버 앱 비밀번호 사용 내역을 봤는데 「사용 이력 없음」이었다. 비밀번호가 틀렸으면 실패 기록이라도 남는다. 이력이 아예 없다는 건 인증 앞에서 끊겼다는 뜻이었다. 정작 내 노트북에서 네이버 IMAP에 붙어보니 그냥 열렸다. 구글을 거치는 게 문제였지 자격증명이 문제가 아니었다. 중계를 빼고 직접 읽는 쪽으로 바꿨다.

둘. 네이버에는 「전달」 메뉴가 없다. 있는 줄 알고 설정 화면을 안내했다가 없다는 답을 들었다. POP3와 IMAP만 있다.

셋. Cloudflare에는 보내는 서버가 없다. Email Routing은 받기 전용이다. 그런데 지메일 발신 설정 화면이 SMTP 서버 칸에 route3.mx.cloudflare.net을 자동으로 채워 넣었다. 그건 받는 서버(MX)다. 그대로 저장하면 실패한다. 넣어야 할 값은 smtp.gmail.com이었다.

세 번 다 "안 되는 이유"를 나중에 알았다. 공통점이 있었다. 계기가 「없음」을 말할 때, 그게 「실패했다」인지 「도달조차 안 했다」인지를 구분하지 않으면 엉뚱한 데를 고친다.

정작 어려운 건 분류였다

배선이 깔리고 나니 진짜 문제가 남았다. 무엇을 알려야 하는가.

처음엔 「조치 필요 / 사람 / 소음」 세 등급으로 나눴다. 돌려보니 이상했다. 내가 눌러야 하는 인스타 인증과, 답장을 써야 하는 문의가 같은 칸에 들어갔다. 성격이 완전히 다른데.

축이 하나여서 생긴 문제였다. 「답장을 해야 하나」와 「내가 알아야 하나」는 다른 질문이다. 그래서 4분면으로 갈랐다.

답장 필요답장 불필요
인지 필요초안을 쓰고 승인을 받는다알리기만 한다
인지 불필요정형 답장 — 알아서 보낸다버린다

251통을 넣어보니 이렇게 갈렸다. 답장+인지 1건, 인지만 4건, 정형 1건, 나머지 245건은 버림이다.

버리는 칸이 압도적으로 크다는 게 핵심이다. 알림이 쓸모 있으려면 대부분을 안 알려야 한다. 그리고 보고서에 「245건 걸렀습니다」라고 쓰지 않기로 했다. 그건 보고가 아니라 자랑이다.

발송 도구에는 잠금을 걸었다

답장을 보내는 도구도 만들었는데, 여기엔 규칙을 코드에 박아 넣었다.

기본값이 안 보내는 것이다. 초안을 화면에 뿌리고 파일로 남길 뿐이다. 보내려면 옵션을 붙여야 하고, 옵션을 붙여도 정형 답장이 아니면 「무엇을 근거로 보내는가」를 적지 않는 한 거부한다.

만들고 나서 시험해보니 버그가 하나 있었다. 발송이 거부됐는데 파일 이름이 sent로 저장되고 있었다. 파일 이름은 실제로 일어난 일을 말해야 한다. 안 보냈는데 sent로 남으면 반년 뒤에 보낸 것으로 읽힌다. 저장은 전부 draft로 하고, 실제로 나간 뒤에만 이름이 바뀌도록 고쳤다.

남은 약점 하나

보내기가 되긴 하는데, 완전하지 않다.

지메일의 「다른 주소에서 보내기」는 겉이름만 바꾸고 실제로는 지메일이 보낸다. 봉투에는 지메일 주소가 찍히고 편지 겉면에만 hello@icenovel.com이 보인다. SPF에 "구글이 우리 대신 보내도 된다"고 공개해 뒀으니 사기는 아니지만, 도장(DKIM 서명)은 못 찍는다.

네이버도 지메일도 통과했고 받은편지함에 정상적으로 들어갔다. 다만 DMARC를 엄격하게 운영하는 기관 서버에서는 걸릴 수 있다. 고치려면 전용 발송 서비스를 붙여야 하는데, 실제로 반려당하는 걸 보고 나서 하기로 했다. 아직 일어나지 않은 일을 위해 만드는 건 계측 없이 손대는 것이다.

아슬아슬했던 것

DNS를 옮기고 한참 뒤에 알았는데, 내가 지난 748통의 메일에 붙여온 명함이 icenovel.com에 이미지로 올라가 있었다. 오늘 A 레코드를 정확히 복제한 덕에 지금도 정상으로 뜬다.

하나만 빠뜨렸으면 과거에 보낸 모든 메일의 명함이 한꺼번에 깨졌을 것이다. 그것도 조용히. 아무도 나에게 알려주지 않았을 것이다.

옮기기 전에 원본 목록을 통째로 받아두고, 옮긴 뒤에 하나씩 대조한 게 유일한 안전장치였다. 이런 건 실수하고 나서 배우면 늦다.

블로그 목록