# NAVER WORKS → Slack 연동 [3/5] 콜드메일 자동 감지 및 IR 분석 시스템

## 날짜: 2025-09-30
## 작성자: Claude (로컬 개발자)
## 위치: `/home/happybell80/ivada_project/DOCS/troubleshooting/250930_naverworks_slack_03_cold_mail_detection_completed.md`
## 상태: 완료 (참고용 문서)

## 완료된 기능
NAVER WORKS 메일 중 투자 제안(콜드메일) 수신 시:
1. 자동 감지 및 필터링 (Naive Bayes)
2. 첨부파일(IR 자료) skill-rag-file 자동 학습
3. AI 분석 요약 생성 후 채널 공유

---

## 구현 완료 (2025-09-30)

### skill-email (커밋: a535732, c498ea2, 926cd69, 30619a3, e2eace3)
- GET /messages/{message_id}: routers/mail_detail_router.py 생성, main.py:311-312 등록
- GET /messages/{message_id}/attachments/{attachment_id}: routers/mail_detail_router.py
- download_attachment 메서드: services/naverworks_provider.py:357-388
- attachCount 필드 추가: services/naverworks_provider.py:277, main.py:266 (926cd69, 30619a3)
- attachments 필드 수정: get_message()에서 data.get("attachments") 사용 (e2eace3)
- mail_detail_router.py: main.get_email_provider() 사용 (c498ea2)

### rb8001 (커밋: 19304ea, 1980a4e, d88615e, 276b258, d0b8605, a6998ed, b4ed61d, 3507ed0)
- app/services/coldmail_filter.py: Incremental Naive Bayes (단어 빈도 기반, Counter 사용, a6998ed), 확률값 로깅 (b4ed61d)
- app/services/coldmail_feedback.py: 피드백 처리 서비스 (b4ed61d)
- app/services/naverworks_file_processor.py: 첨부파일 다운로드→rag-file 업로드, import 경로 수정 (276b258)
- app/services/ir_analyzer.py: IR 지표 추출 (LLM + RAG)
- app/services/startup_valuation.py: Bayesian VC 가치 평가
- app/services/slack_lists_client.py: Slack Lists API 클라이언트
- app/scheduler/jobs/coldmail_briefing.py: 스케줄러 (email from dict 처리 d0b8605, 피드백 버튼 3507ed0)
- app/router/slack_handler.py: coldmail_feedback_yes/no 액션 핸들러 (b4ed61d)
- main.py:197-198: coldmail_briefing.register(scheduler)
- app/skills/naverworks_briefing.py: 초기화 로그 추가 (1980a4e)
- tests/test_coldmail_briefing.py: 9개 테스트 함수
- Dockerfile:30: COPY ./tests /code/tests 추가 (d88615e)

### API 스펙 확인 완료 (2025-09-30)

**NAVER WORKS 첨부파일 다운로드 API**
- **엔드포인트**: `GET https://www.worksapis.com/v1.0/users/{userId}/mail/{mailId}/attachments/{attachmentId}`
- **인증**: OAuth 2.0 Bearer Token, Scope: `mail` 또는 `mail.read`
- **Path Parameters**: userId (me/User ID/Login ID), mailId (메일 ID), attachmentId (첨부파일 ID)
- **Response**: `{"data": "Base64EncodedData", "filename": "file.pdf"}`
- **제한**: 최대 25MB (Admin 설정 따름)
- **선행 작업**: attachmentId는 메일 상세 조회 API에서 획득 필요

**메일 상세 조회 API 응답 확인 (실제 테스트)**
- **attachments 필드 존재 확인**: 원본 API 응답에 attachments 배열 포함
- **확인된 첨부파일 정보**: attachmentId: 2, filename: "04-2. 투자자검토보고서_군돌이.pdf", contentType: "application/pdf", size: 872235
- **✅ 해결 완료**: get_message()에서 data.get("attachments") 사용 (e2eace3)

**Slack Lists API**
- **메서드**: `slackLists.items.create`, `slackLists.items.update`
- **Scope**: `lists:write`, `lists:read`
- **제약**: 유료 플랜 필요
- **문서**: https://docs.slack.dev/reference/methods/slackLists.items.create/

### 첨부파일 처리 검증 완료 (2025-10-03)
- ✅ GET /messages: 30개 메일 중 5개 첨부파일 감지 (attachCount)
- ✅ GET /messages/{id}: attachments 배열 정상 반환 (인라인 이미지/일반 첨부 구분)
- ✅ GET /messages/{id}/attachments/{attachmentId}: 38KB HTML 파일 다운로드 성공

### 환경 설정 완료 (2025-09-30, 51124 서버)
- **DB 테이블**: coldmail_classifier, startup_valuation (51123 서버)
- **환경변수** (rb8001 .env):
  - COLDMAIL_BRIEFING_ENABLED=true
  - COLDMAIL_BRIEFING_SCHEDULE=5 9 * * mon-fri
  - COLDMAIL_CHANNEL_ID=C09HR9BMT51
  - SLACK_LIST_ID=F09J1HPPQJG
  - NAVERWORKS_COMPANY_EMAIL (하드코딩 제거됨)
- **Slack 앱 스코프**: lists:write, lists:read, files:read (files:write 추가 필요)
- **배포**: docker-compose.yml env_file: .env (line 6-7), Dockerfile COPY ./tests (line 30)

---

## 구현된 처리 흐름

### 스케줄러 실행
- 평일 9시 5분 (월요일: 72시간, 화~금: 24시간 조회)
- coldmail_briefing.py:75-189

### 처리 단계
1. NAVERWORKS_COMPANY_EMAIL → get_naverworks_user_uuid() → user_id 조회
2. skill-email GET /messages (startSearchDate, endSearchDate)
3. is_coldmail() 필터링 (Naive Bayes, coldmail_classifier 테이블)
4. 첨부파일 있는 메일만 선택
5. skill-email GET /messages/{message_id} → attachments 정보
6. process_naverworks_attachments() → PDF만 선택 → skill-rag-file POST /api/upload
7. extract_ir_metrics() → skill-rag-file RAG 쿼리 6회 → LLM 요약
8. valuate_startup() → Bayesian VC Method (Prior × Likelihood = Posterior) → startup_valuation 테이블 저장
9. ❌ **미구현**: Slack 파일 업로드 (아래 참조)
10. create_coldmail_list_item() → Slack Lists API (lists.items.create) - 현재 document_id 텍스트만 저장
11. skill-slack POST /api/v1/send → 처리 완료 요약 메시지

### Naive Bayes 학습 루프
- initialize_seed_data(): *.vc 도메인, 투자/IR 키워드 시드 (수동 DB INSERT)
- Slack 채널 피드백 버튼: "✅ 맞음" / "❌ 아님" (coldmail_briefing.py:196-208)
- slack_handler.py: coldmail_feedback_yes/no 액션 → coldmail_feedback.process_coldmail_feedback()
- update_classifier(): 단어별 coldmail_count/normal_count 증가

### 테스트 결과 (30개 이메일, 시드 데이터 101개 단어)
- ✅ 4건 탐지: 빅웨이브 투자유치 (0.8474, 0.7906), SEED 라운드 (0.9835)
- ❌ 미탐지: 내부메일/중립단어 많은 케이스 (0.1880, 0.0548, 0.4017)

---

---

## 테스트

### 테스트 파일
- tests/test_coldmail_briefing.py (9개 함수)

### 실행 방법
- 51124 서버: docker exec -it rb8001 python tests/test_coldmail_briefing.py --test [db|filter|email|attachment|ir|valuation|lists|scheduler]
- 로컬: python tests/test_coldmail_briefing.py

### 필수 환경변수
- COLDMAIL_BRIEFING_ENABLED, COLDMAIL_CHANNEL_ID, SLACK_LIST_ID, NAVERWORKS_COMPANY_EMAIL, SLACK_BOT_TOKEN, DATABASE_URL, SKILL_EMAIL_URL, SKILL_SLACK_URL, SKILL_RAG_FILE_URL