diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fcb499c..3fd7604a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # CHANGE LOG +## main branch + +- 修复 Admin 删除邮件报错 +- UI: 回复邮件按钮, 引用原始邮件文本 +- 添加发送邮件地址黑名单 + ## v0.3.2 ## What's Changed diff --git a/frontend/src/views/admin/AccountSettings.vue b/frontend/src/views/admin/AccountSettings.vue index 6df8f6af..a9c31ff6 100644 --- a/frontend/src/views/admin/AccountSettings.vue +++ b/frontend/src/views/admin/AccountSettings.vue @@ -16,22 +16,26 @@ const { t } = useI18n({ successTip: 'Save Success', address_block_list: 'Address Block Keywords for Users(Admin can skip)', address_block_list_placeholder: 'Please enter the keywords you want to block', + send_address_block_list: 'Address Block Keywords for send email', }, zh: { save: '保存', successTip: '保存成功', address_block_list: '用户地址屏蔽关键词(管理员可跳过检查)', address_block_list_placeholder: '请输入您想要屏蔽的关键词', + send_address_block_list: '发送邮件地址屏蔽关键词', } } }); const addressBlockList = ref([]) +const sendAddressBlockList = ref([]) const fetchData = async () => { try { const res = await api.fetch(`/admin/account_settings`) addressBlockList.value = res.blockList || [] + sendAddressBlockList.value = res.sendBlockList || [] } catch (error) { message.error(error.message || "error"); } @@ -42,7 +46,8 @@ const save = async () => { await api.fetch(`/admin/account_settings`, { method: 'POST', body: JSON.stringify({ - blockList: addressBlockList.value || [] + blockList: addressBlockList.value || [], + sendBlockList: sendAddressBlockList.value || [] }) }) message.success(t('successTip')) @@ -64,6 +69,10 @@ onMounted(async () => { + + + {{ t('save') }} diff --git a/worker/src/admin_api.js b/worker/src/admin_api.js index ab4ffeee..81ebf0bc 100644 --- a/worker/src/admin_api.js +++ b/worker/src/admin_api.js @@ -303,9 +303,11 @@ api.post('/admin/auto_cleanup', cleanup_api.saveCleanup) api.get('/admin/account_settings', async (c) => { try { - const value = await getJsonSetting(c, CONSTANTS.ADDRESS_BLOCK_LIST_KEY); + const blockList = await getJsonSetting(c, CONSTANTS.ADDRESS_BLOCK_LIST_KEY); + const sendBlockList = await getJsonSetting(c, CONSTANTS.SEND_BLOCK_LIST_KEY); return c.json({ - blockList: value || [] + blockList: blockList || [], + sendBlockList: sendBlockList || [] }) } catch (error) { console.error(error); @@ -314,14 +316,18 @@ api.get('/admin/account_settings', async (c) => { }) api.post('/admin/account_settings', async (c) => { - const { blockList } = await c.req.json(); - if (!blockList) { - return c.text("Invalid blockList", 400) + const { blockList, sendBlockList } = await c.req.json(); + if (!blockList || !sendBlockList) { + return c.text("Invalid blockList or sendBlockList", 400) } await saveSetting( c, CONSTANTS.ADDRESS_BLOCK_LIST_KEY, JSON.stringify(blockList) ); + await saveSetting( + c, CONSTANTS.SEND_BLOCK_LIST_KEY, + JSON.stringify(sendBlockList) + ); return c.json({ success: true }) diff --git a/worker/src/constants.js b/worker/src/constants.js index 2768998d..75dab6a1 100644 --- a/worker/src/constants.js +++ b/worker/src/constants.js @@ -1,4 +1,5 @@ export const CONSTANTS = { ADDRESS_BLOCK_LIST_KEY: 'address_block_list', + SEND_BLOCK_LIST_KEY: 'send_block_list', AUTO_CLEANUP_KEY: 'auto_cleanup', } diff --git a/worker/src/send_mail_api.js b/worker/src/send_mail_api.js index 3999bbcf..2de74269 100644 --- a/worker/src/send_mail_api.js +++ b/worker/src/send_mail_api.js @@ -1,4 +1,6 @@ import { Hono } from 'hono' +import { CONSTANTS } from './constants' +import { getJsonSetting } from './utils'; const api = new Hono() @@ -47,6 +49,11 @@ api.post('/api/send_mail', async (c) => { if (!to_mail) { return c.text("Invalid to mail", 400) } + // check SEND_BLOCK_LIST_KEY + const sendBlockList = await getJsonSetting(c, CONSTANTS.SEND_BLOCK_LIST_KEY); + if (sendBlockList && sendBlockList.some((item) => to_mail.includes(item))) { + return c.text("to_mail address is blocked", 400); + } from_name = from_name || address; to_name = to_name || to_mail; if (!subject) {