From 34eb5c94116e9f9441aa6043586134c90b660427 Mon Sep 17 00:00:00 2001 From: hyungi Date: Tue, 9 Jun 2026 22:26:22 +0000 Subject: [PATCH] =?UTF-8?q?refactor(workers)!:=20SMTP=20=EB=A9=94=EC=9D=BC?= =?UTF-8?q?=20=EB=B0=9C=EC=86=A1=20=EA=B8=B0=EB=8A=A5=20=EC=A0=84=EB=A9=B4?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 다이제스트/이메일수집알림/법령알림 메일 발송 폐기 (사용자 결정 2026-06-10). 근거: 게이트(if smtp_host and smtp_user)가 06-07 전엔 항상 false(silent skip), 자격증명 활성 후엔 100% 553 Sender rejected — 한 통도 전달 성공 이력 없음. law_monitor 는 CalDAV VTODO 가 단일 알림 채널로 유지. 다이제스트 .md 생성/ 90일 아카이브, 이메일 IMAP 수집은 무변경. eid dispatch 의 send_smtp_email 문자열 블랙리스트는 의도적 잔존(코드층 박탈 강화와 정합). Co-Authored-By: Claude Fable 5 --- app/core/utils.py | 30 ------------------------------ app/workers/daily_digest.py | 18 +++--------------- app/workers/law_monitor.py | 17 ++--------------- app/workers/mailplus_archive.py | 9 +-------- 4 files changed, 6 insertions(+), 68 deletions(-) diff --git a/app/core/utils.py b/app/core/utils.py index 09763bb..d7349f3 100644 --- a/app/core/utils.py +++ b/app/core/utils.py @@ -106,33 +106,3 @@ END:VCALENDAR""" except Exception as e: logging.getLogger("caldav").error(f"CalDAV VTODO 생성 실패: {e}") return None - - -# ─── SMTP 헬퍼 ─── - - -def send_smtp_email( - host: str, - port: int, - username: str, - password: str, - subject: str, - body: str, - to_addr: str | None = None, -): - """Synology MailPlus SMTP로 이메일 발송""" - import smtplib - from email.mime.text import MIMEText - - to_addr = to_addr or username - msg = MIMEText(body, "plain", "utf-8") - msg["Subject"] = subject - msg["From"] = username - msg["To"] = to_addr - - try: - with smtplib.SMTP_SSL(host, port, timeout=30) as server: - server.login(username, password) - server.send_message(msg) - except Exception as e: - logging.getLogger("smtp").error(f"SMTP 발송 실패: {e}") diff --git a/app/workers/daily_digest.py b/app/workers/daily_digest.py index edd31e0..be68abd 100644 --- a/app/workers/daily_digest.py +++ b/app/workers/daily_digest.py @@ -1,10 +1,10 @@ -"""일일 다이제스트 워커 — PostgreSQL/CalDAV 쿼리 → Markdown + SMTP +"""일일 다이제스트 워커 — PostgreSQL/CalDAV 쿼리 → Markdown 생성 v1 scripts/pkm_daily_digest.py에서 포팅. DEVONthink/OmniFocus → PostgreSQL/CalDAV 쿼리로 전환. +SMTP 발송은 2026-06-10 제거 (한 번도 전달 성공한 적 없는 기능 — 폐기 결정). """ -import os from datetime import datetime, timezone from zoneinfo import ZoneInfo from pathlib import Path @@ -13,7 +13,7 @@ from sqlalchemy import func, select, text from core.config import settings from core.database import async_session -from core.utils import send_smtp_email, setup_logger +from core.utils import setup_logger from models.document import Document from models.queue import ProcessingQueue @@ -133,16 +133,4 @@ async def run(): if old.stat().st_mtime < cutoff: old.rename(archive_dir / old.name) - # ─── SMTP 발송 ─── - smtp_host = os.getenv("MAILPLUS_HOST", "") - smtp_port = int(os.getenv("MAILPLUS_SMTP_PORT", "465")) - smtp_user = os.getenv("MAILPLUS_USER", "") - smtp_pass = os.getenv("MAILPLUS_PASS", "") - if smtp_host and smtp_user: - send_smtp_email( - smtp_host, smtp_port, smtp_user, smtp_pass, - f"PKM 다이제스트 — {date_display}", - markdown, - ) - logger.info(f"다이제스트 생성 완료: {digest_path}") diff --git a/app/workers/law_monitor.py b/app/workers/law_monitor.py index 5212592..a520429 100644 --- a/app/workers/law_monitor.py +++ b/app/workers/law_monitor.py @@ -15,7 +15,7 @@ from sqlalchemy import select from core.config import settings from core.database import async_session -from core.utils import create_caldav_todo, escape_ical_text, file_hash, send_smtp_email, setup_logger +from core.utils import create_caldav_todo, file_hash, setup_logger from models.automation import AutomationState from models.document import Document from models.queue import enqueue_stage @@ -337,8 +337,7 @@ def _safe_name(name: str) -> str: def _send_notifications(law_name: str, proclamation_date: str, revision_type: str): - """CalDAV + SMTP 알림""" - # CalDAV + """CalDAV 할일 알림 (SMTP 발송은 2026-06-10 폐기 — CalDAV 가 단일 알림 채널)""" caldav_url = os.getenv("CALDAV_URL", "") caldav_user = os.getenv("CALDAV_USER", "") caldav_pass = os.getenv("CALDAV_PASS", "") @@ -349,15 +348,3 @@ def _send_notifications(law_name: str, proclamation_date: str, revision_type: st description=f"공포일자: {proclamation_date}, 개정구분: {revision_type}", due_days=7, ) - - # SMTP - smtp_host = os.getenv("MAILPLUS_HOST", "") - smtp_port = int(os.getenv("MAILPLUS_SMTP_PORT", "465")) - smtp_user = os.getenv("MAILPLUS_USER", "") - smtp_pass = os.getenv("MAILPLUS_PASS", "") - if smtp_host and smtp_user: - send_smtp_email( - smtp_host, smtp_port, smtp_user, smtp_pass, - subject=f"[법령 변경] {law_name} ({revision_type})", - body=f"법령명: {law_name}\n공포일자: {proclamation_date}\n개정구분: {revision_type}", - ) diff --git a/app/workers/mailplus_archive.py b/app/workers/mailplus_archive.py index 7bbfd4d..ac0948d 100644 --- a/app/workers/mailplus_archive.py +++ b/app/workers/mailplus_archive.py @@ -17,7 +17,7 @@ from sqlalchemy import select from core.config import settings from core.database import async_session -from core.utils import file_hash, send_smtp_email, setup_logger +from core.utils import file_hash, setup_logger from models.automation import AutomationState from models.document import Document from models.queue import enqueue_stage @@ -201,11 +201,4 @@ async def run(): await session.commit() - # SMTP 알림 - smtp_host = os.getenv("MAILPLUS_HOST", "") - smtp_port = int(os.getenv("MAILPLUS_SMTP_PORT", "465")) - if archived and smtp_host: - body = f"이메일 {len(archived)}건 수집 완료:\n\n" + "\n".join(f"- {s}" for s in archived) - send_smtp_email(smtp_host, smtp_port, user, password, "PKM 이메일 수집 알림", body) - logger.info(f"이메일 {len(archived)}건 수집 완료 (max_uid={max_uid})")