dev/PRD.md, dev/TDD.md, inbox_one.jsx 프로토타입을 바탕으로 실제 실행 가능한 Next.js + API 백엔드 버전으로 확장한 저장소입니다.
npm install
npm run dev기본 주소: http://localhost:3000
기본 보안 동작:
- 앱과 API는 기본적으로
localhost에서만 열립니다. - 다른 기기나 LAN 주소로 열려면
MAIL_SERVICE_ALLOW_REMOTE_ACCESS=true를 명시적으로 켜야 합니다. - 메일 계정 비밀번호/앱 비밀번호는 로컬 JSON 저장소가 아니라 macOS Keychain에 저장됩니다.
custom-imap은 기본적으로 공용으로 라우팅 가능한 IMAP/SMTP 호스트만 허용합니다.
- 보안 점검:
audit-ci,retire,.codex/skills/web-security-audit - 애플리케이션/비즈니스 로직 보안 리뷰:
.codex/skills/inbox-one-security-review - LLM/프롬프트 안전성 리뷰:
.codex/skills/inbox-one-llm-safety - 네트워크 성능 점검:
autocannon,.codex/skills/web-network-performance - 메모리 점검:
clinic,.codex/skills/web-memory-profile - 메모리 점검은 기본적으로 Node
--heap-prof+autocannon을 사용하고, 필요 시clinic을 보조로 사용합니다.
자주 쓰는 명령:
npm run security:scan
npm run perf:network
npm run perf:memory- 통합 인박스 UI
- Next.js App Router 기반 API 백엔드
- 파일 기반 로컬 저장소 (
data/mail-service-db.json) - AI 요약 / 답장 초안 / 브리핑 서버 레이어
- 확장 가능한 메일 provider 레지스트리
- 실제 메일 송신 지원 (
새 메일,답장,전달,CC/BCC,보낸 메일) - IMAP 계정의 원격 메일함 백필 페이지네이션
- 지원 provider
gmail(IMAP/SMTP + 앱 비밀번호)outlook(IMAP/SMTP)naver(IMAP/SMTP + 앱 비밀번호)custom-imap(임의의 IMAP/SMTP 서버)
src/app: 화면과 API routesrc/models: 공용 데이터 모델과 직렬화 가능한 계약src/views/inbox: 메인 인박스 페이지 UIsrc/controllers/inbox: provider 스타일 페이지 상태관리src/services/api: 백엔드 API 매핑 서비스src/services/client: 재사용 가능한 저수준 browser hooks/contextsrc/services/server: 서버 auth / 비즈니스 로직 / provider / storesrc/other/utils: 순수 유틸리티와 persistence helpersrc/components/inbox: 이전 import를 위한 호환 래퍼src/lib/**: 예전 경로를 위한 호환 래퍼
새 메일 작성,답장,전달,참조(CC),숨은참조(BCC)를 지원합니다.- 전송 성공 시
보낸 메일뷰에 sent thread가 생성됩니다. - AI composer는
reply,forward,compose모드별로 3가지 톤 변형 초안을 생성합니다. custom-imap계정은 연결 시 IMAP뿐 아니라 SMTP host/port/TLS 값도 함께 입력해야 전송이 가능합니다.naver계정은 네이버 메일 PC 환경설정에서IMAP/SMTP를사용함으로 바꾼 뒤, 네이버 로그인2단계 인증과애플리케이션 비밀번호를 설정해야 연결됩니다.- Gmail/Naver/Outlook/Custom IMAP은 최초 연결 시 최근 묶음을 먼저 가져오고, 이후 목록 페이지를 더 요청할 때 원격 IMAP에서도 다음 묶음을 계속 백필합니다.
- 파일 기반 개발 저장소는 메모리 폭증을 막기 위해 본문 HTML은 저장하지 않고, 긴 본문 텍스트는 일부만 compact해서 저장합니다.
src/services/server/providers/types.ts의MailProviderDriver인터페이스를 구현합니다.- 새 driver를
src/services/server/providers/registry.ts에 등록합니다. - 필요하면 연결 폼 필드를
descriptor.fields에 정의합니다. syncInbox()에서 공통Thread모델로 정규화해서 반환합니다.- 송신이 필요한 provider는
sendMail()도 구현해 SMTP/API 전송을 처리합니다.
- 현재 AI는 규칙 기반 로컬 레이어입니다. 추후 Anthropic/OpenAI 호출은
src/services/server/services/ai-service.ts뒤에 교체하면 됩니다. - 로컬 저장소는 데모/개발용입니다. 운영 전환 시 Supabase/Postgres 저장소를 같은 서비스 계층 뒤에 붙이면 됩니다.
- Outlook은 현재 SMTP/IMAP 비밀번호 기반 구현이라, Microsoft 계정 정책에 따라 Modern Auth/OAuth 전환이 추가로 필요할 수 있습니다.
현재 웹 앱을 기준으로 별도 Flutter 프로젝트를 시작하려면 아래 문서를 참고하면 됩니다.
dev/flutter/PRD.mddev/flutter/TDD.mddev/flutter/DELIVERY_PLAN.md
MAIL_SERVICE_ALLOW_REMOTE_ACCESS=false
MAIL_SERVICE_SESSION_SECRET=
MAIL_SERVICE_ALLOW_PRIVATE_MAIL_HOSTS=false
MAIL_SERVICE_ALLOW_INSECURE_FILE_SECRETS=falseMAIL_SERVICE_ALLOW_REMOTE_ACCESS- 기본값은
false입니다.true일 때만localhost외 주소에서 앱을 엽니다.
- 기본값은
MAIL_SERVICE_SESSION_SECRET- 데모 세션 서명용 비밀값입니다. 로컬 기본값이 있지만, 원격 접속을 열 경우 직접 설정하는 편이 안전합니다.
MAIL_SERVICE_ALLOW_PRIVATE_MAIL_HOSTS- 기본값은
false입니다.custom-imap에서 사설망/loopback 호스트를 꼭 써야 할 때만true로 여세요.
- 기본값은
MAIL_SERVICE_ALLOW_INSECURE_FILE_SECRETS- macOS Keychain이 없는 환경에서만 예외적으로 파일 기반 secret 저장을 허용합니다. 기본값
false를 유지하는 편이 안전합니다.
- macOS Keychain이 없는 환경에서만 예외적으로 파일 기반 secret 저장을 허용합니다. 기본값