fix: 이메일 멀티 폴더 조회 + Synology 무응답 방지

- email_tool: INBOX/Gmail/Technicalkorea 3개 폴더 순회
  - 폴더별 try/except isolation (하나 실패해도 나머지 조회)
  - UID → folder:uid 형식 (폴더간 충돌 방지)
  - 날짜 parsedate_to_datetime 정렬
  - 폴더 라벨 표시 (개인/Gmail/회사)
- worker: response_sent 플래그 + finally 무응답 방지
  - 어떤 에러 경로에서든 Synology에 최소 1회 응답 보장

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-04-06 14:38:35 +09:00
parent f73c46de3a
commit 12ca8f19d9
3 changed files with 89 additions and 39 deletions

View File

@@ -21,6 +21,7 @@ class Job:
rewritten_message: str = ""
callback: str = "" # "synology" | ""
callback_meta: dict = field(default_factory=dict) # username, user_id 등
response_sent: bool = False # Synology에 응답 전송 여부
class JobManager:

View File

@@ -88,11 +88,12 @@ def _parse_classification(raw: str) -> dict:
async def _send_callback(job: Job, text: str) -> None:
"""Synology callback이면 전송."""
"""Synology callback이면 전송 + response_sent 플래그."""
if job.callback == "synology":
if len(text) > SYNOLOGY_MAX_LEN:
text = text[:SYNOLOGY_MAX_LEN] + "\n\n...(생략됨)"
await send_to_synology(text)
job.response_sent = True
def _pre_route(message: str) -> dict | None:
@@ -387,6 +388,7 @@ async def run(job: Job) -> None:
if job.callback == "synology":
try:
await send_to_synology("⚠️ 처리 중 오류가 발생했습니다. 다시 시도해주세요.", raw=True)
job.response_sent = True
except Exception:
pass
try:
@@ -395,3 +397,9 @@ async def run(job: Job) -> None:
pass
finally:
await state_stream.push_done(job.id)
# Synology 무응답 방지: 응답이 한 번도 안 갔으면 에러 메시지
if job.callback == "synology" and not job.response_sent:
try:
await send_to_synology("⚠️ 요청을 처리하지 못했습니다. 다시 시도해주세요.", raw=True)
except Exception:
pass