✏️ Fix: [dev] mail 기능 수정

This commit is contained in:
sm4640
2026-01-13 09:38:11 +09:00
parent 32c11c40bb
commit f4788f66bc

View File

@@ -1,5 +1,6 @@
import os import os
import re import re
import time
from django.conf import settings from django.conf import settings
from django.shortcuts import render 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])?$") 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 # Feature toggle
@@ -84,11 +88,22 @@ def _dms_exec(setup_args):
raise raise
except Exception as e: except Exception as e:
raise APIException(f"Failed to exec into '{name}'. ({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(): def _email_list():
out = _dms_exec(["email", "list"]) raw = _dms_exec(["email", "list"])
return [ln.strip() for ln in out.splitlines() if ln.strip()] 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 # Create account inside dms-mailserver
_dms_exec(["email", "add", address, password]) _dms_exec(["email", "add", address, password])
# Verify by listing again if _wait_until_exists(address):
emails2 = _email_list()
if address in emails2:
return Response({"message": f"{address} 계정이 잘 만들어졌습니다! (email list에서 확인됨)"}) return Response({"message": f"{address} 계정이 잘 만들어졌습니다! (email list에서 확인됨)"})
return Response( return Response({"detail": "계정 생성 후 list에서 확인이 안 됩니다. 다시 제출 버튼을 눌러서 확인해보시거나 관리자에게 문의해주세요."}, status=500)
{"detail": "계정 생성 후 list에서 확인이 안 됩니다."},
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
)
except ValueError as e: except ValueError as e:
# setup command returned error msg = str(e)
return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST) 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: except Exception as e:
return Response({"detail": f"서버 오류: {e}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response({"detail": f"서버 오류: {e}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)