diff --git a/requirements.txt b/requirements.txt index 93b8ba34..3e8d1d9c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,3 +14,4 @@ aiosqlite>=0.19.0 psycopg[binary]>=3.1.18 # 自动绑卡(local_auto)依赖 playwright>=1.40.0 +requests>=2.33.1 diff --git a/src/web/routes/email.py b/src/web/routes/email.py index 8dfb1b45..a303d080 100644 --- a/src/web/routes/email.py +++ b/src/web/routes/email.py @@ -452,6 +452,9 @@ async def update_email_service(service_id: int, request: EmailServiceUpdate): # 合并配置而不是替换 current_config = normalize_email_service_config(service.service_type, service.config) merged_config = {**current_config, **request.config} + # 显式清空 CloudMail 子域名 + if "subdomain" in request.config and not str(request.config.get("subdomain") or "").strip(): + merged_config.pop("subdomain", None) # 移除空值 merged_config = {k: v for k, v in merged_config.items() if v} update_data["config"] = normalize_email_service_config(service.service_type, merged_config) diff --git a/static/js/email_services.js b/static/js/email_services.js index 0cd23ceb..7d464afe 100644 --- a/static/js/email_services.js +++ b/static/js/email_services.js @@ -585,7 +585,7 @@ async function handleAddCustom(e) { domain: formData.get('fm_domain') }; } else if (subType === 'cloudmail') { - serviceType = 'cloud_mail'; + serviceType = 'cloudmail'; const domainInput = formData.get('cm_domain'); let domain = domainInput; if (domainInput && domainInput.includes(',')) { @@ -940,11 +940,9 @@ async function handleEditCustom(e) { admin_email: formData.get('cm_admin_email'), domain: domain }; - // 添加子域配置(如果有) + // 始终带上 subdomain,便于后端识别清空操作 const subdomain = formData.get('cm_subdomain'); - if (subdomain && subdomain.trim()) { - config.subdomain = subdomain.trim(); - } + config.subdomain = (subdomain || '').trim(); const pwd = formData.get('cm_admin_password'); if (pwd && pwd.trim()) config.admin_password = pwd.trim(); } else {