Skip to content

fix(mail): 审核邮件按用户注册语言发送,统一服务器名前缀与 {server_name} 占位符 - #25

Open
qs5668 wants to merge 1 commit into
KiteMC:masterfrom
qs5668:fix/mail-i18n
Open

fix(mail): 审核邮件按用户注册语言发送,统一服务器名前缀与 {server_name} 占位符#25
qs5668 wants to merge 1 commit into
KiteMC:masterfrom
qs5668:fix/mail-i18n

Conversation

@qs5668

@qs5668 qs5668 commented Aug 22, 2026

Copy link
Copy Markdown

问题背景

实际部署 v1.8.0 时发现邮件通知存在 4 个相关问题:

1. 审核结果邮件语言与用户注册语言不符(主要问题)

用户用中文界面注册(收到的验证码邮件是中文),但管理员审核通过/拒绝后,收到的通知邮件却是英文的。

根因AdminUserHandler.sendReviewResult()/vmc approve|reject 命令都用 ctx.getConfigManager().getLanguage()(服务器全局配置)决定邮件语言,而用户数据中没有存储注册时的界面语言。

2. 审核邮件标题硬编码 [VerifyMC] 前缀

审核邮件标题为 [VerifyMC] Your whitelist application has been approved,使用的是插件名而不是 web_server_prefix 配置的服务器名。验证码邮件标题走 email_subject 配置项(可自定义),审核邮件却写死了,两者行为不一致。

3. 验证码邮件模板不支持 {server_name} 占位符

MailService.sendCode() 只替换 {code},不替换 {server_name};而 sendReviewResultNotification() 两者都替换。验证码模板作者无法引用服务器名。

4. 默认验证码模板页脚硬编码插件名

verify_code_*.html 页脚固定为"此邮件由 VerifyMC 自动发送",多服部署或换了服务器名时无法自定义。

修复内容

  • 按用户语言发送审核邮件:注册时把界面语言写入用户记录(RegistrationProcessingHandler → 新增 userDao.setUserLanguage());审核发信时优先读用户语言,无记录的老用户回退到全局 language 配置(完全向后兼容)
  • 审核邮件标题用服务器名:前缀取 web_server_prefix,zh/en 各自本地化
  • 验证码邮件支持 {server_name}sendCode() 补齐占位符替换,与审核模板能力对齐
  • DAO 层支持
    • UserDao 接口新增 setUserLanguage()
    • FileUserDao:users.json 用户记录增加 language 字段
    • MysqlUserDao:建表语句加 language VARCHAR(8) NULL;存量表启动时自动 ALTER TABLE 迁移(与现有 discord_id 列迁移同一模式);查询结果带出 language

测试

Leaves 1.21.8 + 本补丁构建的 jar,三个测试用户(本地 SMTP 捕获邮件验证):

用户 存储语言 审核邮件标题 正文模板
MailLenEN en <服务器名> Whitelist Application Approved 英文
MailLenZH zh <服务器名> 白名单申请已通过 中文
MailLenNone (无,模拟老用户) <服务器名> 白名单申请已通过 中文(回退到 language 配置)

兼容性:users.json 老数据无 language 字段时行为与修复前一致;Web 管理面板和 /vmc 命令两个审核入口行为统一。

- 注册时记录用户界面语言(users.json / MySQL 新增 language 字段,存量表自动迁移)
- 审核结果邮件按用户注册语言发送,无记录的老用户回退到全局 language 配置
- 审核邮件标题改用 web_server_prefix 作为前缀,不再硬编码 [VerifyMC]
- 验证码邮件模板补齐 {server_name} 占位符替换,与审核模板能力一致
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant