작업물을 불러오는 중…
Mailer
여러 메일 계정을 한 화면에 모아 무시할 것과 봐야 할 것을 가려내는 데스크톱 앱. 규칙으로 먼저 분류하고, 내가 고쳐 준 분류는 그 발신자의 규칙으로 남아 이미 받은 메일까지 소급 적용된다. 서버가 없고 영구 삭제도 하지 않는다.
스크린샷
왜 만들었나
업무용 Gmail, 연락용 네이버, 개인용 다음. 계정이 셋으로 흩어지니 어느 하나는 늘 안 열어 보게 되고, 그 사이에 봐야 할 메일이 광고에 묻힙니다.
메일 클라이언트를 새로 설치해 계정을 옮기는 대신, 이미 쓰는 계정들을 한 화면에서 정리하는 도구를 만들었습니다.
규칙이 먼저, LLM 은 나중
분류를 처음부터 LLM 에 맡기면 결과를 예측할 수 없고 비용이 통수에 비례합니다.
그래서 발신자·도메인·키워드 규칙으로 먼저 판정합니다. 규칙은 코드가 아니라 JSON 에 있습니다. 여기서 답이 나오면 그걸로 끝이고, 비용은 0 입니다.
고쳐 주면 규칙이 된다
미분류 메일에 분류를 지정하면 그 발신자를 규칙으로 저장해, 다음부터 같은 발신자를 자동으로 분류합니다. 발신자만으로 가릴 수 없는 자리는 제목 문맥을 통계로 학습해 대신 판정하고, 근거가 얇으면 틀리게 답하는 대신 미분류로 보류합니다.
중요한 건 그다음입니다. 학습이 일어나면 이미 받아 둔 메일까지 전부 다시 분류합니다. 안 그러면 "오늘부터 잘 분류되는" 도구가 되고, 어제까지 쌓인 것은 손으로 치워야 합니다.
전량 재적용은 실제 데이터 4,488통에서 0.05~0.10초입니다. 처음엔 건별 커밋이라 3,636건에 39.6초가 걸렸는데, 500건 배치 트랜잭션으로 0.1초가 됐습니다.
같은 발신자가 서로 다른 분류로 지정된 이력이 있으면 그 발신자에는 아예 규칙을 만들지 않고, 이미 있던 규칙은 거둡니다. 성격이 갈리는 발신자를 억지로 한 칸에 밀어 넣는 것보다 미분류로 두는 편이 낫습니다.
되돌릴 수 있게 만든다
분류는 틀립니다. 그래서 이 앱은 영구 삭제를 하지 않습니다. 스팸으로 판정해도 서버 휴지통으로 옮기는 데까지입니다. 오판은 언제든 되돌릴 수 있습니다.
본문은 저장하지 않습니다. 헤더(발신자·제목·날짜·플래그)만 받아 두고 본문은 열어 볼 때 그때 가져옵니다. HTML 본문의 외부 이미지는 기본으로 차단하고, 이번만 허용을 배너로 물어봅니다.
사용자에게 IMAP 포트를 묻지 않는다
초기 화면에는 서버 주소와 포트 입력칸이 있었습니다. 그걸 아는 사람이라면 이 도구가 필요 없습니다.
지금은 제공자 버튼만 있습니다. Gmail 과 Microsoft 는 브라우저가 열리고, 네이버·다음·카카오는 해당 사이트에서 발급받은 앱 전용 비밀번호를 받습니다. 어느 쪽이든 이 앱 안에 계정 비밀번호를 입력하는 화면은 없습니다. 목록에 없는 제공자는 메일 주소만 넣으면 서버를 자동으로 찾습니다.
상태
착수 5일차입니다. 다계정 등록·수집·분류·학습·검색·휴지통이 돌아가고, 최근에 화면을 3분할로 다시 짰습니다. 완성품이 아니라 MVP 가 도는 단계입니다.
파이썬 47개 파일 약 12,400줄에 테스트 42개 파일 약 9,300줄, 기획서 10개 챕터입니다. core/ 는 tkinter 를 import 하지 않고 ui/ 는 분석 로직을 갖지 않는다는 경계를 불변식으로 두고 있어, 나중에 모바일로 옮길 때 core/ 를 그대로 씁니다.


