AI한테 메일 감지→문자/카톡 자동 발송 시켰더니
AI한테 메일 감지→문자/카톡 자동 발송 시켰더니
결과부터 — 메일 오면 30초 안에 문자가 나간다
거래처에서 발주 메일을 보내면, 30초 안에 담당자한테 이런 메시지가 자동으로 갑니다:
[접수 확인] OO기업 발주 건이 접수되었습니다. 예상 납품일: 3월 18일 (화) 오전. 문의사항은 회신 부탁드립니다.
사람이 하는 일은 없어요. 메일함을 열 필요도, 문자를 직접 보낼 필요도 없습니다. 컴퓨터가 5분마다 메일함을 확인하고, 새 발주 메일을 발견하면, 등록된 거래처인지 확인해서, 맞으면 문자나 카카오톡을 쏴줍니다.
이 자동화를 AI한테 만들게 시킨 건데... 생각보다 훨씬 까다로웠어요. 특히 같은 문자가 두 번 가는 문제를 고치는 데만 15번을 수정했습니다.
"메일 오면 문자 보내줘" — 이러면 안 나옵니다
처음에 AI한테 던진 말:
메일 오면 문자 보내줘
돌아온 건 "이메일 웹훅을 설정하면 됩니다"라는 한 줄짜리 일반론이었어요. 그래서 뭘 어떻게 하라는 건지 전혀 감이 안 잡혔거든요.
프롬프트를 완전히 바꿨습니다:
당신은 이메일 시스템 전문가입니다.
[동작 흐름]
1. 메일함을 주기적으로 체크 (5분 간격)
2. 새 메일 감지 시 발신자 이메일을 DB 등록 업체 목록과 대조
3. 매칭되면 SMS 또는 카카오 알림톡 발송
4. 발송 기록 테이블에 기록하여 중복 발송 방지
[기술 제약]
- 서버에서 24시간 돌아가는 프로그램 (5분마다 실행)
- 메일함에 수천 건의 기존 메일이 있으므로 전체를 매번 읽으면 안 됨
[핵심 요구]
같은 메일에 대해 알림이 두 번 가면 안 됨. 중복 방지 로직 필수.
차이가 뭐냐면요. "수천 건의 기존 메일이 있다"는 현실 제약과, "두 번 가면 안 된다"는 핵심 요구를 넣었어요. 이 두 가지만 추가했을 뿐인데 AI가 설계한 구조가 완전히 달라졌습니다.
AI가 만든 구조 — 메일 확인을 3단계로 쪼갰다
AI가 "수천 건 메일함에서 효율적으로 새 메일만 찾기"를 위해 3단계 구조를 만들어줬어요:
1단계 — 제목만 훑기: 메일함에서 제목, 보낸 사람, 날짜만 빠르게 가져옵니다. 본문은 아직 안 읽어요. 수천 건 중에서 "새 메일 후보"만 빠르게 걸러내는 단계. 2단계 — 이미 처리한 건 걸러내기: 후보 메일을 DB에 저장된 "이미 처리한 메일 목록"과 대조해요. 이미 문자 보낸 건 건너뜁니다. 3단계 — 진짜 새 메일만 본문 읽기: 여기서야 메일 내용을 자세히 읽습니다. 발주 관련 키워드가 있는지, 어느 거래처에서 온 건지 파악해요.이렇게 나누면 메일함에 1만 건이 있어도 매번 전부 읽지 않아요. 1단계에서 제목만, 2단계에서 DB 체크, 3단계에서 진짜 필요한 것만 읽으니까 빠르고 효율적이죠.
거래처 매칭 — "이 메일, 우리 거래처 맞아?"
메일을 감지했으면 다음 문제: 이 메일이 등록된 거래처에서 온 건지 어떻게 판별하느냐?
당신은 이메일 분류 시스템 전문가입니다.
[요청]
발신자 메일을 DB 등록 업체와 매칭하는 로직을 만들어주세요.
[매칭 우선순위]
1. 이메일 주소가 정확히 일치 (가장 확실)
2. 이메일 뒤의 도메인(@뒤)이 일치 (같은 회사 다른 직원)
3. 메일 제목+본문에서 등록된 업체명 검색 (약한 매칭)
[주의]
- 같은 업체에서 발주가 아닌 일반 문의 메일도 올 수 있음
- HTML 메일에서 태그 속성에 "order" 문자열이 들어가는 경우 있음
→ HTML 태그를 먼저 제거한 후 키워드 검색해야 함
"HTML 태그에서 오탐 방지"를 넣은 게 중요했어요. 실제로 AI가 만든 첫 버전에서 HTML 코드 안에 있는 영어 단어가 "발주" 키워드에 걸리는 문제가 있었거든요. "HTML 태그를 먼저 제거한 후 검색"이라고 피드백했더니 바로 고쳐졌습니다.
발주인지 아닌지도 구분합니다. 등록 업체 메일이라도 "회식 장소 추천해주세요" 같은 건 발주가 아니니까요. 메일 제목/본문에서 발주, 주문, 납품 같은 키워드를 찾거나, 첨부파일(견적서, 발주서)이 있는지 확인합니다.
가장 골치 아팠던 문제 — 같은 문자가 두세 번 갔다
거래처에서 연락이 왔어요. "같은 내용의 문자가 세 번이나 와요." DB를 열어봤더니 진짜였습니다. 하나의 발주 메일에 대해 문자가 2~3건씩 나가고 있었어요.
처음에 AI한테 "중복 방지 추가해줘"라고 했을 때는 기본적인 이력 테이블을 만들어줬습니다. 문자 보내기 전에 "이미 보냈나?" 확인하는 방식. 깔끔하죠? 근데 이틀 뒤에 또 중복이 터졌습니다.
원인이 하나가 아니었어요. 고칠 때마다 다른 경로에서 중복이 터졌습니다:
| 몇 번째 수정 | 뭐가 문제였나 | 어떻게 알았나 |
|---|---|---|
| 1-3번 | 메일을 "읽음" 처리하는 게 실패 → 같은 메일 재처리 | 서버 재시작 후 이미 보낸 문자가 또 감 |
| 4-7번 | 같은 메일인데 식별자가 매번 달라짐 | 메일 본문 인코딩이 가져올 때마다 미세하게 다름 |
| 8-11번 | 프로그램이 동시에 2번 실행 → 같은 메일 2건 처리 | 서버 부하 시 스케줄러가 겹침 |
| 12-15번 | 문자 발송은 됐는데 응답 시간 초과 → "실패"로 기록 → 재발송 | API 응답이 느릴 때 |
중복 방지를 5번 수정했는데 여전히 엣지 케이스가 있습니다.
현재까지 적용한 방어:
1. 발송 이력 테이블로 체크
2. 메일 읽음 처리 수정
3. 메일 식별자 기반 중복 확인
4. 보낸사람+제목+날짜 조합 체크
그런데 API 타임아웃 후 재시도 시, 실제로는 발송됐는데
응답 타임아웃으로 "실패" 처리 → 재발송되는 케이스가 있습니다.
같은 업체+담당자+오늘 날짜 기준으로 추가 체크해주세요.
"이미 시도한 4가지"를 다 알려줬더니 AI가 같은 제안을 반복하지 않고, 타임아웃 시나리오에 특화된 해결책을 줬어요. 이게 핵심이었습니다. AI한테 디버깅을 시킬 때는 "뭐가 안 돼"만 말하면 안 되고, "이미 뭘 해봤는데 안 됐다"를 같이 알려줘야 새로운 방향의 답이 나옵니다.
최종 방어 — 3겹으로 막았다
결국 중복 방지를 3겹으로 쌓았습니다:
1겹 — 메일 단계: 같은 메일이 DB에 두 번 저장되지 않게 고유 식별자로 막음 2겹 — 문자 단계: 같은 메일 + 같은 담당자 + 같은 채널(SMS/카카오톡) 조합이면 DB가 거부 3겹 — 에러 분류: 문자 발송 실패 시 "재시도해도 되는 에러"와 "재시도해봤자 소용없는 에러"를 구분- 전화번호가 틀리면? → 100번 보내도 안 됨. 재시도 안 함
- 네트워크 일시 장애? → 잠깐 기다렸다가 재시도. 최대 3번
문자 비용 — 카카오톡이 SMS보다 저렴
재미있는 건 비용이에요. 카카오톡 알림톡이 SMS보다 확실히 저렴하거든요. 그래서 카카오톡을 먼저 시도하고, 실패하면 SMS로 자동 전환하는 구조를 만들었어요. 확인 전화 수백 통을 대체하는 비용치고는 충분히 합리적이었습니다.
한계점 — 완벽하지는 않다
솔직히 아직 남은 문제들이 있어요:
- 발주 판별 정확도: 키워드 기반이라 "발주 취소합니다" 같은 메일도 발주로 잡힐 수 있음. 아직 자연어 분석은 안 넣었습니다.
- 메일 형식 다양성: 거래처마다 메일 형식이 달라서, 납품 예정일 메시지에 들어갈 정보를 자동 추출하는 건 한계가 있어요. 업체명은 매칭하지만 품목/수량은 아직 수동 확인이 필요.
- 서버 비용: Railway에서 24시간 돌아가니까 월 5달러 정도 나옵니다. 무료는 아니에요.
다른 곳에도 써볼 수 있을까?
이 "메일 감지 → 자동 알림" 구조는 발주 말고도 쓸 수 있을 것 같아요:
- 고객 문의 자동 접수 확인: 문의 메일 오면 "접수되었습니다" 자동 발송
- 채용 지원서 알림: 지원 메일 오면 담당자에게 즉시 알림
- 계약서/견적서 알림: 특정 키워드(계약, 견적) 포함 메일이 오면 팀장에게 알림