From 738eaa521152d6d5791b40929911d85bc1643023 Mon Sep 17 00:00:00 2001 From: yuyx <237899745@qq.com> Date: Mon, 15 Dec 2025 20:32:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=82=AE=E4=BB=B6=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=92=8CSMTP=E9=85=8D=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin-frontend/src/api/smtp.js | 4 ++ admin-frontend/src/pages/EmailPage.vue | 33 ++++++++++++++- email_service.py | 17 ++++++++ routes/admin_api/core.py | 12 ++++++ static/admin/.vite/manifest.json | 40 +++++++++---------- ...nv30t.js => AnnouncementsPage-L5yVXHzU.js} | 2 +- static/admin/assets/EmailPage-CnYKqgXc.css | 1 + static/admin/assets/EmailPage-MVQ8NXWH.js | 1 - static/admin/assets/EmailPage-qHIhKChc.js | 1 + static/admin/assets/EmailPage-rjdHSL6t.css | 1 - ...-VtHcv1l3.js => FeedbacksPage-DPKEyWIv.js} | 2 +- ...sPage-DJpjJkiT.js => LogsPage-EUt-yBa-.js} | 2 +- ...ge-BQ1HrHQZ.js => PendingPage-D8-nvUo0.js} | 2 +- ...e-Dw-cPgJM.js => SettingsPage-8bHYJpQZ.js} | 2 +- ...Page-8WacBSiG.js => StatsPage-D_TFEGc9.js} | 2 +- ...age-CM9A6Faz.js => SystemPage-CbqDATVe.js} | 2 +- ...Page-Bd2ccTR3.js => UsersPage-COyIOdOo.js} | 2 +- .../{index-BqAAVlPU.js => index-DMMQbxWA.js} | 4 +- ...rce-DzNjmQDj.js => taskSource-B7bFDyX8.js} | 2 +- .../{users-B1kPIkKM.js => users-BKWiZCGY.js} | 2 +- static/admin/index.html | 2 +- 21 files changed, 100 insertions(+), 36 deletions(-) rename static/admin/assets/{AnnouncementsPage-DUunv30t.js => AnnouncementsPage-L5yVXHzU.js} (98%) create mode 100644 static/admin/assets/EmailPage-CnYKqgXc.css delete mode 100644 static/admin/assets/EmailPage-MVQ8NXWH.js create mode 100644 static/admin/assets/EmailPage-qHIhKChc.js delete mode 100644 static/admin/assets/EmailPage-rjdHSL6t.css rename static/admin/assets/{FeedbacksPage-VtHcv1l3.js => FeedbacksPage-DPKEyWIv.js} (97%) rename static/admin/assets/{LogsPage-DJpjJkiT.js => LogsPage-EUt-yBa-.js} (95%) rename static/admin/assets/{PendingPage-BQ1HrHQZ.js => PendingPage-D8-nvUo0.js} (97%) rename static/admin/assets/{SettingsPage-Dw-cPgJM.js => SettingsPage-8bHYJpQZ.js} (97%) rename static/admin/assets/{StatsPage-8WacBSiG.js => StatsPage-D_TFEGc9.js} (97%) rename static/admin/assets/{SystemPage-CM9A6Faz.js => SystemPage-CbqDATVe.js} (99%) rename static/admin/assets/{UsersPage-Bd2ccTR3.js => UsersPage-COyIOdOo.js} (98%) rename static/admin/assets/{index-BqAAVlPU.js => index-DMMQbxWA.js} (99%) rename static/admin/assets/{taskSource-DzNjmQDj.js => taskSource-B7bFDyX8.js} (94%) rename static/admin/assets/{users-B1kPIkKM.js => users-BKWiZCGY.js} (91%) diff --git a/admin-frontend/src/api/smtp.js b/admin-frontend/src/api/smtp.js index 3603115..3622a4b 100644 --- a/admin-frontend/src/api/smtp.js +++ b/admin-frontend/src/api/smtp.js @@ -30,3 +30,7 @@ export async function setPrimarySmtpConfig(configId) { return data } +export async function clearPrimarySmtpConfig() { + const { data } = await api.post('/smtp/configs/primary/clear') + return data +} diff --git a/admin-frontend/src/pages/EmailPage.vue b/admin-frontend/src/pages/EmailPage.vue index 0d65312..72f3f32 100644 --- a/admin-frontend/src/pages/EmailPage.vue +++ b/admin-frontend/src/pages/EmailPage.vue @@ -5,6 +5,7 @@ import { ElMessage, ElMessageBox } from 'element-plus' import { cleanupEmailLogs, fetchEmailLogs, fetchEmailSettings, fetchEmailStats, updateEmailSettings } from '../api/email' import { createSmtpConfig, + clearPrimarySmtpConfig, deleteSmtpConfig, fetchSmtpConfigs, setPrimarySmtpConfig, @@ -85,6 +86,7 @@ const smtpConfigs = ref([]) const smtpDialogOpen = ref(false) const smtpEditMode = ref(false) const smtpHasPassword = ref(false) +const smtpIsPrimary = ref(false) const smtpForm = reactive({ id: null, @@ -231,6 +233,7 @@ function resetSmtpForm() { smtpForm.daily_limit = 0 smtpForm.priority = 0 smtpHasPassword.value = false + smtpIsPrimary.value = false smtpTemplateKey.value = 'custom' } @@ -270,6 +273,7 @@ function openEditSmtp(row) { smtpForm.daily_limit = row.daily_limit ?? 0 smtpForm.priority = row.priority ?? 0 smtpHasPassword.value = Boolean(row.has_password) + smtpIsPrimary.value = Boolean(row.is_primary) smtpTemplateKey.value = inferSmtpTemplateKey(row) smtpDialogOpen.value = true @@ -398,6 +402,32 @@ async function doSetPrimary() { } } +async function doClearPrimary() { + if (!smtpEditMode.value) return + try { + await ElMessageBox.confirm('确定取消主配置吗?取消后将按优先级选择可用SMTP。', '取消主配置', { + confirmButtonText: '取消主配置', + cancelButtonText: '保留', + type: 'warning', + }) + } catch { + return + } + + try { + const res = await clearPrimarySmtpConfig() + if (!res?.success) { + ElMessage.error(res?.error || '操作失败') + return + } + ElMessage.success('已取消主配置') + smtpDialogOpen.value = false + await loadSmtpConfigs() + } catch { + // handled by interceptor + } +} + async function doDeleteSmtp() { if (!smtpEditMode.value || !smtpForm.id) return try { @@ -781,7 +811,8 @@ onMounted(refreshAll)