diff --git a/mail-vue/src/components/email-scroll/index.vue b/mail-vue/src/components/email-scroll/index.vue index 0cd2093e..329b480d 100644 --- a/mail-vue/src/components/email-scroll/index.vue +++ b/mail-vue/src/components/email-scroll/index.vue @@ -11,6 +11,7 @@
+ diff --git a/mail-vue/src/views/sys-setting/index.vue b/mail-vue/src/views/sys-setting/index.vue index 92c16e36..abd20368 100644 --- a/mail-vue/src/views/sys-setting/index.vue +++ b/mail-vue/src/views/sys-setting/index.vue @@ -120,6 +120,15 @@
+
+
Footer
+
+ {{ setting.footer || 'None' }} + + + +
+
@@ -413,6 +422,12 @@ {{ $t('save') }} + +
+ + {{ $t('save') }} + +
@@ -764,6 +779,7 @@ const localUpShow = ref(false) const accountStore = useAccountStore(); const userStore = useUserStore(); const editTitleShow = ref(false) +const editFooterShow = ref(false) const resendTokenFormShow = ref(false) const r2DomainShow = ref(false) const turnstileShow = ref(false) @@ -777,6 +793,7 @@ const settingStore = useSettingStore(); const uiStore = useUiStore(); const {settings: setting} = storeToRefs(settingStore); const editTitle = ref('') +const editFooter = ref('') const settingLoading = ref(false) const clearS3Loading = ref(false) const r2DomainInput = ref('') diff --git a/mail-worker/src/entity/setting.js b/mail-worker/src/entity/setting.js index 31bdd38e..32e54a6c 100644 --- a/mail-worker/src/entity/setting.js +++ b/mail-worker/src/entity/setting.js @@ -1,4 +1,4 @@ -import { sqliteTable, text, integer} from 'drizzle-orm/sqlite-core'; +import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'; export const setting = sqliteTable('setting', { register: integer('register').default(0).notNull(), receive: integer('receive').default(0).notNull(), @@ -46,6 +46,7 @@ export const setting = sqliteTable('setting', { tgMsgTo: text('tg_msg_to').default('show').notNull(), tgMsgText: text('tg_msg_text').default('hide').notNull(), minEmailPrefix: integer('min_email_prefix').default(0).notNull(), - emailPrefixFilter: text('email_prefix_filter').default('').notNull() + emailPrefixFilter: text('email_prefix_filter').default('').notNull(), + footer: text('footer').default('').notNull() }); export default setting diff --git a/mail-worker/src/service/setting-service.js b/mail-worker/src/service/setting-service.js index cccc6d54..886329a2 100644 --- a/mail-worker/src/service/setting-service.js +++ b/mail-worker/src/service/setting-service.js @@ -1,18 +1,19 @@ import KvConst from '../const/kv-const'; import setting from '../entity/setting'; import orm from '../entity/orm'; -import {verifyRecordType} from '../const/entity-const'; +import { verifyRecordType } from '../const/entity-const'; import fileUtils from '../utils/file-utils'; import r2Service from './r2-service'; import constant from '../const/constant'; import BizError from '../error/biz-error'; -import {t} from '../i18n/i18n' +import { t } from '../i18n/i18n' import verifyRecordService from './verify-record-service'; const settingService = { async refresh(c) { const settingRow = await orm(c).select().from(setting).get(); + if (!settingRow) return; settingRow.resendTokens = JSON.parse(settingRow.resendTokens); c.set('setting', settingRow); await c.env.kv.put(KvConst.SETTING, JSON.stringify(settingRow)); @@ -134,7 +135,7 @@ const settingService = { } if (background) { - await r2Service.delete(c,background) + await r2Service.delete(c, background) await orm(c).update(setting).set({ background: '' }).run(); await this.refresh(c) } @@ -170,6 +171,14 @@ const settingService = { async websiteConfig(c) { const settingRow = await this.get(c, true); + let domainList = []; + try { + domainList = JSON.parse(settingRow.domainList); + } catch (e) { + if (settingRow.domainList && typeof settingRow.domainList === 'string') { + domainList = settingRow.domainList.split(',').map(d => d.trim()).filter(d => d); + } + } return { register: settingRow.register, @@ -184,7 +193,7 @@ const settingService = { siteKey: settingRow.siteKey, background: settingRow.background, loginOpacity: settingRow.loginOpacity, - domainList: settingRow.domainList, + domainList: settingRow.loginDomain === 1 ? domainList : [], regKey: settingRow.regKey, regVerifyOpen: settingRow.regVerifyOpen, addVerifyOpen: settingRow.addVerifyOpen, @@ -200,7 +209,8 @@ const settingService = { linuxdoClientId: settingRow.linuxdoClientId, linuxdoCallbackUrl: settingRow.linuxdoCallbackUrl, linuxdoSwitch: settingRow.linuxdoSwitch, - minEmailPrefix: settingRow.minEmailPrefix + minEmailPrefix: settingRow.minEmailPrefix, + footer: settingRow.footer }; } }; diff --git a/mail-worker/src/service/user-service.js b/mail-worker/src/service/user-service.js index 333145b1..48177739 100644 --- a/mail-worker/src/service/user-service.js +++ b/mail-worker/src/service/user-service.js @@ -16,8 +16,9 @@ import saltHashUtils from '../utils/crypto-utils'; import constant from '../const/constant'; import { t } from '../i18n/i18n' import reqUtils from '../utils/req-utils'; -import {oauth} from "../entity/oauth"; +import { oauth } from "../entity/oauth"; import oauthService from "./oauth-service"; +import settingService from "./setting-service"; const userService = { @@ -170,7 +171,7 @@ const userService = { emailService.selectUserEmailCountList(c, userIds, emailConst.type.SEND, isDel.DELETE), accountService.selectUserAccountCountList(c, userIds), accountService.selectUserAccountCountList(c, userIds, isDel.DELETE), - roleService.selectByIdsHasPermKey(c, types,'email:send') + roleService.selectByIdsHasPermKey(c, types, 'email:send') ]); const receiveMap = Object.fromEntries(emailCounts.map(item => [item.userId, item.count])); @@ -223,7 +224,7 @@ const userService = { const activeIp = reqUtils.getIp(c); - const {os, browser, device} = reqUtils.getUserAgent(c); + const { os, browser, device } = reqUtils.getUserAgent(c); const params = { os, @@ -303,7 +304,8 @@ const userService = { const { email, type, password } = params; - if (!c.env.domain.includes(emailUtils.getDomain(email))) { + const { domainList } = await settingService.query(c); + if (!domainList.includes('@' + emailUtils.getDomain(email))) { throw new BizError(t('notEmailDomain')); } @@ -365,7 +367,7 @@ const userService = { listByRegKeyId(c, regKeyId) { return orm(c) - .select({email: user.email,createTime: user.createTime}) + .select({ email: user.email, createTime: user.createTime }) .from(user) .where(eq(user.regKeyId, regKeyId)) .orderBy(desc(user.userId)) diff --git a/mail-worker/wrangler.toml b/mail-worker/wrangler.toml index b8ec3891..3eecd74f 100644 --- a/mail-worker/wrangler.toml +++ b/mail-worker/wrangler.toml @@ -31,7 +31,7 @@ crons = ["0 16 * * *"] #定时任务每天晚上12点执行 #[vars] #orm_log = false -#domain = [] #邮件域名可可配置多个 示例: ["example1.com","example2.com"] +domain = [] #邮件域名可可配置多个 示例: ["example1.com","example2.com"] #admin = "" #管理员的邮箱 示例: admin@example.com #jwt_secret = "" #jwt令牌的密钥,随便填一串字符串