fix: Email Routing MIME 파싱 개선 + 레거시 코드 정리

- Email Routing에서 수신한 이메일 파싱 수정
  - Quoted-Printable UTF-8 디코딩 함수 추가
  - HTML <br/> 태그를 줄바꿈으로 변환
  - SMS 키워드 위치 기반 본문 추출

- 레거시 코드 삭제
  - /api/bank-notification 엔드포인트 제거 (Email Routing으로 대체)
  - BANK_API_SECRET 관련 코드 및 문서 제거
  - DEPOSIT_AGENT_ID 제거 (Assistants API → 코드 직접 처리)

- CLI 테스트 클라이언트 개선
  - .env 파일 자동 로드 지원
  - WEBHOOK_SECRET 환경변수 불필요

- 문서 업데이트
  - NAMECHEAP_API_KEY 설명 명확화 (래퍼 인증 키)
  - CLI 테스트 섹션 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-01-18 13:12:26 +09:00
parent edbd790538
commit 89f8ea19f1
8 changed files with 156 additions and 215 deletions

View File

@@ -1,5 +1,8 @@
# CLAUDE.md
> 🔧 **개발자용 문서**: 기술 상세, 코드 패턴, 트러블슈팅
> 📖 **[README.md](./README.md)**: 기능 소개, 배포 가이드, 사용법
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Auto-Read on Start
@@ -69,8 +72,8 @@ npm run chat # CLI 테스트 클라이언트
**CLI 테스트 클라이언트:**
```bash
# 환경변수 설정
export WEBHOOK_SECRET="..." # Vault: secret/data/telegram-bot
# .env 파일 생성 (최초 1회)
echo 'WEBHOOK_SECRET=...' > .env # Vault: secret/data/telegram-bot
# 대화형 모드
npm run chat
@@ -84,6 +87,7 @@ npm run chat "날씨 알려줘"
wrangler secret put BOT_TOKEN # Telegram Bot Token
wrangler secret put WEBHOOK_SECRET # Webhook 검증용
wrangler secret put OPENAI_API_KEY # OpenAI API 키
wrangler secret put NAMECHEAP_API_KEY # namecheap-api 래퍼 인증 키
```
**Webhook 설정:**
@@ -223,7 +227,7 @@ Telegram Webhook → Security Validation → Command/Message Router
| 문서 | `lookup_docs` | Context7 | 문서, 사용법, API |
| 도메인 | `manage_domain` | 코드 직접 처리 → Namecheap | 도메인, 네임서버, WHOIS |
| 도메인 추천 | `suggest_domains` | GPT + Namecheap | **도메인 추천, 도메인 제안, 도메인 아이디어** |
| 예치금 | `manage_deposit` | 코드 직접 처리 → D1 | **입금, 충전, 잔액, 계좌, 송금** |
| 예치금 | `manage_deposit` | 코드 직접 처리 | **입금, 충전, 잔액, 계좌, 송금** |
**Data Layer (D1 SQLite):**
| 테이블 | 용도 | 주요 컬럼 |
@@ -351,18 +355,6 @@ case 'new_tool':
**로그:** `[search_web] 번역: "판골린 VPN" → "Pangolin VPN"`
### Deposit Agent 프롬프트 수정 방법
```bash
# Vault에서 API 키 조회
curl -s -H "X-Vault-Token: hvs.xxx" https://vault.anvil.it.com/v1/secret/data/openai
# Assistant 프롬프트 업데이트
curl -X POST 'https://api.openai.com/v1/assistants/asst_XMoVGU7ZwRpUPI6PHGvRNm8E' \
-H 'Authorization: Bearer sk-xxx' \
-H 'OpenAI-Beta: assistants=v2' \
-d @update-agent.json
```
---
## Configuration
@@ -375,7 +367,6 @@ curl -X POST 'https://api.openai.com/v1/assistants/asst_XMoVGU7ZwRpUPI6PHGvRNm8E
| `DOMAIN_OWNER_ID` | - | 도메인 관리 권한 Telegram ID |
| `DEPOSIT_ADMIN_ID` | - | 예치금 관리 권한 Telegram ID |
| `WEBHOOK_SECRET` | - | Telegram Webhook 인증 (wrangler secret, Vault: telegram-bot) |
| `BANK_API_SECRET` | - | 입금 알림 API 인증 키 (wrangler secret) |
| `BRAVE_API_KEY` | - | Brave Search API 키 (wrangler secret) |
| `DEPOSIT_API_SECRET` | - | Deposit API 인증 키 (namecheap-api용, wrangler secret) |
@@ -392,8 +383,7 @@ curl -X POST 'https://api.openai.com/v1/assistants/asst_XMoVGU7ZwRpUPI6PHGvRNm8E
| wttr.in | 날씨 | wttr.in | - |
| Brave Search | 검색 | api.search.brave.com | Free AI 플랜 (2,000/월) |
| Vault | API 키 관리 | vault.anvil.it.com | - |
| Gmail | 입금 SMS 수신 | deposit.anvil@gmail.com | Apps Script 연동 |
| Apps Script | Gmail → Worker 연동 | script.google.com | 1분마다 실행, message_id 중복 방지 |
| Email Routing | 입금 SMS 수신 | Cloudflare Email Routing | Worker email handler로 직접 처리 |
### Cloudflare AI Gateway
@@ -423,10 +413,8 @@ URL: gateway.ai.cloudflare.com/v1/{account_id}/telegram-bot/openai/...
매칭 O → confirmed + 잔액↑ | 매칭 X → pending
[시나리오 2: SMS 먼저 - Gmail → Apps Script → Worker]
은행 SMS → Gmail(deposit.anvil@gmail.com) → Apps Script (1분마다)
POST /api/bank-notification
[시나리오 2: SMS 먼저 - Email Routing]
은행 SMS → 메일 전달 → Cloudflare Email Routing → Worker (email handler)
파싱 → bank_notifications 저장
@@ -442,22 +430,9 @@ URL: gateway.ai.cloudflare.com/v1/{account_id}/telegram-bot/openai/...
| 자동 매칭 성공 | ✅ 입금액 + 현재 잔액 | ✅ 입금 정보 + 매칭 완료 |
| 매칭 대기 (SMS만) | - | ✅ 입금 정보 + 대기 상태 |
**Gmail → Worker 연동:**
- Gmail 계정: `deposit.anvil@gmail.com`
- Apps Script: 1분마다 `is:unread 입금` 검색 → Worker API 호출
- 중복 방지: Gmail message_id 기반
**API 엔드포인트:**
```
POST /api/bank-notification
Content-Type: application/json
{
"content": "[Web발신]\n하나,01/16, 23:30\n427******27104\n입금5원\n황병하",
"messageId": "19bc737b3415596a",
"secret": "BANK_API_SECRET 값"
}
```
**Email Routing 설정:**
- Cloudflare Dashboard → Email → Email Routing → Routes
- 수신 주소 → Worker: `telegram-summary-bot` 라우팅
**입금 계좌:** 하나은행 427-910018-27104 (주식회사 아이언클래드)
- Vault 경로: `secret/companies/ironclad-corp`