From f4788f66bc43c776741b15058689f87a31ca516b Mon Sep 17 00:00:00 2001 From: sm4640 Date: Tue, 13 Jan 2026 09:38:11 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix:=20[dev]=20mail=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mail/views.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/mail/views.py b/mail/views.py index deb95b1..2a1e320 100644 --- a/mail/views.py +++ b/mail/views.py @@ -1,5 +1,6 @@ import os import re +import time from django.conf import settings from django.shortcuts import render @@ -16,6 +17,9 @@ except ImportError: LOCAL_RE = re.compile(r"^[a-z0-9](?:[a-z0-9._-]{0,62}[a-z0-9])?$") +ANSI_RE = re.compile(r"\x1B\[[0-?]*[ -/]*[@-~]") +EMAIL_RE = re.compile(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}") + # ---------------------------- # Feature toggle @@ -84,11 +88,22 @@ def _dms_exec(setup_args): raise except Exception as e: raise APIException(f"Failed to exec into '{name}'. ({e})") + +def _wait_until_exists(address: str, tries: int = 3, delay: float = 0.3) -> bool: + addr = address.strip().lower() + for _ in range(tries): + if addr in _email_list(): + return True + time.sleep(delay) + return False def _email_list(): - out = _dms_exec(["email", "list"]) - return [ln.strip() for ln in out.splitlines() if ln.strip()] + raw = _dms_exec(["email", "list"]) + raw = ANSI_RE.sub("", raw) # 색상코드 제거 + # 어떤 형식이 와도 이메일만 뽑아냄 + emails = set(m.group(0).strip().lower() for m in EMAIL_RE.finditer(raw)) + return sorted(emails) # ---------------------------- @@ -142,19 +157,16 @@ def request_account(request): # Create account inside dms-mailserver _dms_exec(["email", "add", address, password]) - # Verify by listing again - emails2 = _email_list() - if address in emails2: + if _wait_until_exists(address): return Response({"message": f"✅ {address} 계정이 잘 만들어졌습니다! (email list에서 확인됨)"}) - return Response( - {"detail": "계정 생성 후 list에서 확인이 안 됩니다."}, - status=status.HTTP_500_INTERNAL_SERVER_ERROR, - ) + return Response({"detail": "계정 생성 후 list에서 확인이 안 됩니다. 다시 제출 버튼을 눌러서 확인해보시거나 관리자에게 문의해주세요."}, status=500) except ValueError as e: - # setup command returned error - return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST) + msg = str(e) + if "already exists" in msg.lower(): + return Response({"message": f"ℹ️ {address} 는 이미 존재합니다."}) + return Response({"detail": msg}, status=status.HTTP_400_BAD_REQUEST) except Exception as e: return Response({"detail": f"서버 오류: {e}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)