# UML[체크] - 사용자 메일 관리 시스템 ## 공정 상태 **진행률: 90%** (IMAP 완성, POP3 미구현) --- ## 구현 체크리스트 ### 데이터베이스 - [x] DB 마이그레이션 작성 (user_mail_accounts 테이블 생성) ### 패키지 설치 - [ ] npm install node-pop3 (설치됨, 서비스 미구현) ### 백엔드 서비스 계층 - [x] userMailAccountService.ts (DB CRUD) - [x] userMailImapService.ts (IMAP 프로토콜) - [x] userMailSmtpService.ts (SMTP 발송) - [x] imapConnectionPool.ts (IMAP 연결 풀) - [x] mailCache.ts (메일 캐시) - [ ] userMailPop3Service.ts (POP3 프로토콜 - 미구현) ### 백엔드 API 계층 - [x] userMailController.ts (요청 처리) - [x] userMailRoutes.ts (라우트 정의) - [x] app.ts에 userMailRoutes 등록 (`/api/user-mail`) ### 프론트엔드 API 클라이언트 - [x] frontend/lib/api/userMail.ts ### 프론트엔드 페이지 - [x] frontend/app/(main)/mail/imap/page.tsx - [x] frontend/app/(main)/mail/imap/ComposeDialog.tsx (메일 작성) - [ ] frontend/app/(main)/mail/pop3/page.tsx (미구현) ### 페이지 등록 - [x] AdminPageRenderer.tsx에 /mail/imap 등록 - [ ] AdminPageRenderer.tsx에 /mail/pop3 등록 (미구현) --- ## 구현된 IMAP 기능 ### 계정 관리 - [x] 계정 추가 (연결 테스트 후 저장) - [x] 계정 수정 - [x] 계정 삭제 - [x] 연결 테스트 (저장 전 자동 + 수동) ### 메일 조회 - [x] SSE 스트리밍으로 메일 목록 로드 (20개씩) - [x] 이전 메일 더 보기 (무한 스크롤 방식) - [x] 메일 상세 조회 (HTML/텍스트 본문) - [x] 폴더별 메일 조회 (INBOX, 휴지통, 스팸 등) - [x] 새로고침 버튼 ### 메일 관리 - [x] 읽음 처리 (클릭 시 자동, IMAP \Seen 플래그) - [x] 메일 삭제 (\Trash 특수 폴더로 이동 - Gmail 호환) - [x] 메일 이동 (폴더 간 이동) ### 첨부파일 - [x] 첨부파일 목록 표시 (pill 형태) - [x] 첨부파일 다운로드 (ReadableStream 진행바 표시) - [x] Content-Length 헤더 지원 (정확한 진행률) ### 발신 - [x] 메일 작성 / 발송 (SMTP) - [x] 답장 (Re: 제목, inReplyTo 헤더) - [x] 전달 (Fwd: 제목, 원본 본문 인용) ### UI - [x] 3단 패널 레이아웃 (계정 / 메일 목록 / 상세) - [x] 폴더 목록 (unseen 카운트 표시) - [x] 읽음/삭제 후 unseen 카운트 자동 갱신 - [x] 검색 (제목/발신자 클라이언트 필터) --- ## 검증 체크리스트 ### 데이터베이스 - [x] `user_mail_accounts` 테이블 존재 확인 - [x] 테이블 스키마 정확성 확인 ### 계정 관리 API - [x] POST `/api/user-mail/accounts` - 계정 생성 - [x] GET `/api/user-mail/accounts` - 사용자 계정 목록 - [x] PUT `/api/user-mail/accounts/:id` - 계정 수정 - [x] DELETE `/api/user-mail/accounts/:id` - 계정 삭제 - [x] POST `/api/user-mail/accounts/:id/test` - 연결 테스트 - [x] POST `/api/user-mail/test-connection` - 직접 연결 테스트 ### 메일 API - [x] GET `/api/user-mail/accounts/:id/mails/stream` - 스트리밍 목록 - [x] GET `/api/user-mail/accounts/:id/mails/:seqno` - 상세 조회 - [x] POST `/api/user-mail/accounts/:id/mails/:seqno/mark-read` - 읽음 처리 - [x] DELETE `/api/user-mail/accounts/:id/mails/:seqno` - 삭제 (휴지통 이동) - [x] POST `/api/user-mail/accounts/:id/mails/:seqno/move` - 이동 - [x] GET `/api/user-mail/accounts/:id/folders` - 폴더 목록 - [x] GET `/api/user-mail/accounts/:id/folders/:folder/mails/stream` - 폴더별 스트리밍 - [x] GET `/api/user-mail/accounts/:id/mails/:seqno/attachments` - 첨부파일 목록 - [x] GET `/api/user-mail/accounts/:id/mails/:seqno/attachment/:partId` - 첨부파일 다운로드 - [x] POST `/api/user-mail/accounts/:id/send` - 메일 발송 ### 사용자 격리 검증 - [x] 모든 쿼리에 WHERE user_id = $n 포함 (DB 레벨 강제) - [x] 다른 user_id로 계정 접근 시 404 반환 ### 프론트엔드 페이지 - [x] `/mail/imap` 페이지 접속 및 동작 - [x] Gmail IMAP 연동 확인 - [x] 메일 목록 → 상세 → 읽음 처리 - [x] 첨부파일 다운로드 진행바 - [x] 메일 삭제 → Gmail 휴지통 이동 확인 - [x] 답장/전달 발송 확인 --- ## 알려진 이슈 및 주의사항 ### 1. 메일 삭제 방식 - `\Trash` 특수 폴더로 이동 (EXPUNGE 아님) - Gmail 호환: `[Gmail]/휴지통`으로 자동 라우팅 - 폴더 없으면 `messageDelete` fallback (영구 삭제 주의) ### 2. 첨부파일 진행바 - Content-Length 헤더 기반 진행률 계산 - imapflow `meta.size`로 헤더 설정 - totalSize fallback: `getUserMailAttachments`의 size 필드 사용 ### 3. IMAP 연결 풀 - 계정당 1개 연결 유지 (maxIdleMs: 5분) - busy 상태 시 큐잉 처리 - 연결 끊김 시 자동 재연결 ### 4. 캐시 - 메일 목록: 60초 TTL - 메일 상세: 5분 TTL - 읽음/삭제/이동 시 해당 캐시 무효화 ### 5. POP3 미구현 - `node-pop3` 패키지 설치됨 - 서비스 파일 미작성 - 팀장 지시 후 구현 예정 --- ## 변경 이력 | 날짜 | 버전 | 내용 | |------|------|------| | 2026-03-27 | v1.0 | 초안 작성 | | 2026-03-30 | v2.0 | IMAP 전 기능 구현 완료 (메일 조회/삭제/이동/첨부/발송/답장/전달/폴더/진행바) | --- ## 관련 문서 - [UML[계획]-user-mail.md](./UML[계획]-user-mail.md): 아키텍처 및 설계