📧 AdventureMail

支持 GUI 操作的 Minecraft 服务器邮件插件

📨 10种邮件类型 📎 四种附件 🗄️ MySQL跨服同步 📋 模板系统 🌐 Web编辑器 📦 Paper 1.21+

功能一览

📬
邮箱GUI
分类筛选,分页浏览,未读邮件闪烁提示
📨
邮件类型
10种邮件类型,4大分类,独立属性
📎
附件系统
物品/金币/点券/指令四种附件
📤
发件箱
管理员查看已发送记录
📋
模板系统
保存/加载/删除邮件模板
🗑️
回收站
删除可恢复,7天自动清理
定时邮件
立即/延迟/定时三种模式
🗄️
数据库
MySQL + HikariCP 跨服同步
🔔
登录提醒
上线提示未读和未领取附件
✏️
管理员GUI
可视化编辑,草稿保护
📖
书本模式
邮件可选书本界面查看
🌐
Web编辑器
浏览器端编辑,生成YAML/命令

前置依赖

插件说明用途
Vault经济前置 (软依赖)金币/点券附件
PlaceholderAPI变量支持 (软依赖)占位符解析
LuckPerms权限插件 (软依赖)按权限组发送

兼容性

项目要求
服务端Paper 1.21.4+
JavaJDK 21+
代理端BungeeCord / Velocity(跨服可选)
数据库MySQL 8.0+(跨服可选)/ YAML本地

📥 安装配置

全新安装

  1. 下载 Paper 1.21.4+ 服务端
  2. AdventureMail-5.2.0.jar 放入 plugins/
  3. 启动服务器,自动生成配置
  4. 按需修改 config.ymlmessages.yml
  5. /amail reload 重载

文件结构

plugins/AdventureMail/
├── config.yml              # 主配置
├── messages.yml            # 消息文本
├── mails/<UUID>.yml       # 玩家邮件数据(YAML模式)
├── sent/<玩家名>.yml       # 发件箱记录
├── templates/              # 邮件模板
└── scheduled.yml           # 定时邮件队列

群组服配置

  1. 在所有子服安装 AdventureMail-5.2.0.jar
  2. 修改每个子服的 config.yml(详见跨服配置
  3. 重启所有子服
⚠ 注意

每个子服的 server-id 必须不同,但 servers 列表必须完全一致!

⌨️ 命令权限

玩家命令

命令说明
/amail打开邮箱GUI
/amail check检查未读邮件和未领取附件
/amail markallread全部标记已读
/amail claimall一键领取所有附件
/amail outbox查看发件箱

管理员命令

命令说明
/amail admin管理员面板GUI
/amail template邮件模板管理
/amail send <目标类型> <目标值> <标题> [--type 类型] <内容>命令行发送
/amail reload重载配置
/amail dbstatusDB/Redis/跨服状态
/amail dbreset confirm清空邮件数据
/amail dbreset all confirm完全重置含注册表
/amail dbclean清理过期邮件
ℹ️ 别名

/amail = /adventuremail = /mail

命令行发送示例

# 发送给指定玩家
/amail send player Steve 系统通知 欢迎来到服务器!

# 发送给全服(指定邮件类型)
/amail send all _ 服务器公告 --type system_notice 今晚维护

# 发送给有权限的玩家
/amail send permission vip.access VIP专属 --type event_ranking VIP通知

# 发送给所有在线玩家
/amail send online _ 在线奖励 --type system_reward 感谢在线

目标类型:player / all / online / permission

权限节点

权限说明默认
adventuremail.use使用邮箱GUI(打开/查看/领取)所有玩家
adventuremail.admin管理员权限(发送/面板/模板/重载)OP

PAPI 占位符

变量说明
%adventuremail_unread%未读邮件数量
%adventuremail_unclaimed%未领取附件邮件数量
%adventuremail_total%邮件总数
%adventuremail_trashed%回收站邮件数

消息内置变量

变量说明
%count%数量(动态)
%player%玩家名
%name%模板名/邮件标题
& 颜色代码Minecraft颜色代码

📝 更新记录

v5.2.2

  • CONFIG softdepend 更新 — plugin.yml 新增 AdventureManage 为可选依赖,提升跨插件兼容性

v5.2.1

  • FIX 跨服邮件投递Bug:resolveRecipients 从 Redis 线程移至主线程
  • 每个收件人独立 Mail 对象避免 ID 冲突
  • NEW 数据库管理指令:/amail dbstatus / dbreset / dbclean

v5.2.0

  • NEW 书本模式 (view-mode: book)
  • NEW 未读邮件闪烁:每秒交替类型图标↔红色染料
  • FIX 双行标题重复显示
  • IMPROVED 跨服性能:移除15秒DB轮询改用事件驱动
  • FIX Redis cross_send 回调 + 新增玩家UUID注册表

v5.1.0

  • 跨服邮件:Redis cross_send 广播实现真正跨服投递
  • 多步目标选择向导(多选服务器+多选玩家类型GUI)
  • MailManager.sendMail 支持多目标类型合并收件人

v5.0.0

  • Redis跨服同步全面重写(server-id过滤、JSON结构化、指数退避重连)
  • 所有玩家消息100%可自定义(messages.yml 50+条目)

v4.0.0

  • 邮箱分类筛选(红=系统/黄=活动/绿=社交/蓝=安全)
  • 邮件显示格式重做 + Web编辑器同步更新

v3.x

  • v3.2.0 — Web邮件编辑器
  • v3.1.0 — 领取截止时间 + 草稿保护 + 性能优化
  • v3.0.0 — 邮件类型系统(10种) + MySQL + StorageProvider

v2.0.0

  • 回收站、模板、发件箱、一键领取/全部已读、定时邮件、过期清理

📨 邮件类型系统

四大分类

分类颜色说明
系统邮件 (SYSTEM)🟢 绿色系统自动发送(奖励/补偿/通知)
活动邮件 (EVENT)🩷 粉色活动相关奖励(参与/排名/抽奖)
社交邮件 (SOCIAL)🔵 青色玩家互动(私信/公会)
安全邮件 (SECURITY)🔴 红色安全通知(举报/违规处罚)

10种邮件类型

类型ID显示名分类图标附件过期优先级
system_reward系统奖励SYSTEMCHEST7天
system_compensation系统补偿SYSTEMNETHER_STAR14天
system_notice系统通知SYSTEMBOOK7天
event_participation活动参与奖EVENTFIREWORK_ROCKET7天
event_ranking排名奖励EVENTGOLDEN_APPLE14天
event_lottery抽奖奖励EVENTEND_ROD7天
social_private玩家私信SOCIALPAPER30天
social_guild公会邮件SOCIALWHITE_BANNER14天
security_report举报反馈SECURITYREDSTONE30天
security_punish违规处罚SECURITYBARRIER永久

特殊属性

  • 违规处罚 (security_punish):不可删除,登录时强制显示
  • 玩家私信 (social_private):支持回复功能
  • 每种类型有独立的通知音效

查看模式

模式说明
gui默认GUI界面预览,物品附件可视化
book书本模式,Minecraft原生书本界面

书本模式:标题金色加粗,正文自动分页,[关闭]/[领取] 可点击按钮。

mail-types:
  system_notice:
    view-mode: book
  system_reward:
    view-mode: gui

每秒交替切换:邮件类型图标 ↔ 红色染料(附魔光效)。全局一个定时任务,性能友好。

📎 附件系统

附件类型说明
📦 物品任意Minecraft物品,保留NBT/附魔/Lore,背包满自动掉落
💰 金币金币数量(需Vault)
💎 点券点券数量(需Vault)
⚡ 指令执行指令奖励,三种模式

指令执行模式

模式说明
CONSOLE以控制台身份执行
OP临时赋予OP执行后移除
PLAYER以玩家身份执行

变量:{player} = 玩家名,{uuid} = UUID

🖥️ GUI 界面

玩家邮箱 /amail

54格箱子界面,4行×7列显示邮件列表:

图标状态
📕 BOOK未读纯文本邮件
📄 PAPER已读纯文本
📦 CHEST_MINECART带附件未领取
🛒 MINECART已领取附件

操作方式

  • 左键 → 标记已读
  • 右键 → 打开邮件预览
  • Shift+右键 → 删除(移到回收站)

底栏按钮

槽位按钮功能
47漏斗 一键领取领取所有未领取附件
48绿色染料 全部已读标记所有为已读
49书 邮箱信息总邮件/未读/未领取
50书与笔 发件箱已发送记录
51炼药锅 回收站已删除的邮件
53命令方块 管理面板仅管理员可见

邮件编辑GUI(管理员)

槽位按钮功能
10命名牌设置标题
12发布者名称
14编辑内容(多行)
16标靶选择目标(玩家/全服/在线/权限)
19箱子附加物品
21金锭金币数量
23钻石点券数量
25命令方块指令奖励
37漏斗过期天数
38类型图标选择邮件类型
39时钟发送时间
40时钟领取截止
41知识之书模板管理
43混凝土发送
53TNT重置草稿(Shift+右键)

其他GUI

GUI功能
邮件预览查看详情,领取附件
发件箱已发送记录,分页
回收站恢复/永久删除/一键清空,默认保留7天
模板列表加载/保存/删除模板
物品附件从背包拖拽物品(2行×7列=14格)
草稿确认ESC关闭时弹出确认
指令类型选择选择执行方式
发送时间设置立即/延迟/定时

📋 模板 / 定时 / 回收站

模板系统

  • 保存模板 — 当前草稿存为模板
  • 加载模板 — 从模板恢复到编辑界面
  • 删除模板 — 移除不需要的模板
  • 保存在 plugins/AdventureMail/templates/

模板保存所有属性:标题、内容、附件、邮件类型等。

定时邮件

模式说明
立即发送编辑完成直接发送
延迟发送设定延迟时间
定时发送设定具体时间点

数据保存在 scheduled.yml,重启后自动恢复。

回收站

  • 删除的邮件移入回收站,可恢复永久删除
  • 支持一键清空
  • 默认保留 7天,到期自动清理
mail:
  trash-retain-days: 7

🗄️ 数据库

YAML 模式(默认)

  • 单服本地文件存储,保存在 mails/
  • 无需额外配置,适合单服

MySQL 模式(跨服同步)

  • HikariCP 高性能连接池
  • 自动建表(amail_mails + amail_sent
  • 支持 BungeeCord / Velocity 多子服共享
  • 单条记录级精确更新
storage:
  type: mysql
  mysql:
    host: localhost
    port: 3306
    database: adventuremail
    username: root
    password: "your_password"
    table-prefix: "amail_"
    pool-size: 10

🌐 跨服配置

⚠ 前提

跨服同步需要 MySQL + Redis,所有子服连接同一实例。

storage:
  type: mysql
  mysql:
    host: 数据库地址          # 所有子服相同
    database: adventuremail
    username: your_user
    password: your_password
  redis:
    enabled: true             # 跨服必须启用!
    host: redis地址            # 所有子服相同
    port: 6379

cross-server:
  enabled: true
  server-id: "lobby"          # 每个子服不同!
  server-name: "主城服"
  servers:                    # 所有子服必须一致!
    - id: "lobby"
      name: "&a主城服"
      icon: GRASS_BLOCK
    - id: "survival"
      name: "&2生存服"
      icon: DIAMOND_PICKAXE
⚠ 重要

每个子服的 server-id 必须不同,但 servers 列表必须完全一致!

通信架构

  • 子服A发送 → MySQL写入 → Redis广播 cross_send
  • 子服B收到 → 事件驱动刷新缓存 → 在线玩家收到通知
  • 支持500人在线(移除高频DB轮询)

⚙️ 配置参考

存储设置

storage:
  type: yaml                    # yaml 或 mysql
  mysql:
    host: localhost
    port: 3306
    database: adventuremail
    username: root
    password: ""
    table-prefix: "amail_"
    pool-size: 10

邮件设置

mail:
  max-mails-per-player: 50
  expire-days: 30
  trash-retain-days: 7
  default-sender-display: "来自Feiiy管理组"
  claim-deadline-days: 7

GUI / 通知

gui:
  title: "&6&l冒险邮件"
  mails-per-page: 28

notification:
  login-reminder: true
  sound-enabled: true

邮件类型配置

mail_types:
  system_reward:
    enabled: true
    display_name: "&a系统奖励"
    icon: CHEST
    allow_attachments: true
    default_expiry_days: 7
    priority: HIGH
    sound: ENTITY_PLAYER_LEVELUP
  security_punish:
    enabled: true
    display_name: "&4违规处罚"
    icon: BARRIER
    allow_attachments: false
    expiry: permanent
    priority: HIGH
    sound: ENTITY_WITHER_SPAWN
    settings:
      cannot_delete: true
      force_read: true

消息配置 (messages.yml)

prefix: "&a&l[冒险邮件] &f"

player:
  mail-received: "&a您收到了一封新邮件!"
  login-unread: "&e您有 &f%count% &e封未读邮件"
  login-unclaimed: "&a您有 &f%count% &a封附件待领取"
  mark-all-read: "&a已将 &e%count% &a封标记为已读"
  claim-all: "&a已领取 &e%count% &a封附件"

admin:
  mail-sent: "&a邮件发送成功!"
  template-saved: "&a模板已保存: &e%name%"

input:
  enter-title: "&f请输入邮件标题 &7(cancel 取消):"
  enter-content: "&f请输入邮件内容 &7(done 完成, cancel 取消):"

messages.yml 支持 50+ 条目完全自定义。

🧩 项目结构 / 数据库表 / 构建

项目结构

AdventureMail/
├── pom.xml
└── src/main/
    ├── java/com/adventuremail/
    │   ├── AdventureMail.java          # 主类
    │   ├── ConfigManager.java          # 配置管理
    │   ├── MailManager.java            # 邮件核心
    │   ├── MailCommandExecutor.java    # 命令处理
    │   ├── model/
    │   │   ├── Mail.java / MailDraft.java
    │   │   ├── MailType.java (10种)
    │   │   ├── MailCategory.java (4分类)
    │   │   ├── MailCommand.java / TargetType.java
    │   ├── storage/
    │   │   ├── StorageProvider.java     # 存储抽象
    │   │   ├── YamlStorage.java
    │   │   ├── DatabaseManager.java    # HikariCP
    │   │   └── DatabaseStorage.java    # MySQL
    │   ├── gui/  (18个GUI类)
    │   └── listener/
    │       └── PlayerJoinListener.java
    └── resources/
        ├── plugin.yml / config.yml / messages.yml
web-editor/
└── index.html                          # Web邮件编辑器

数据库表结构

amail_mails

字段类型说明
idVARCHAR(64)邮件唯一ID(联合主键)
recipientVARCHAR(36)收件人UUID(联合主键)
mail_typeVARCHAR(32)邮件类型ID
sender / sender_displayVARCHAR发件人
titleVARCHAR(256)标题
contentTEXT内容
items_dataMEDIUMTEXT物品序列化(Base64)
coins / couponsDOUBLE / INT金币/点券
commands_dataTEXT指令数据
send_time / expire_timeBIGINT发送/过期时间戳
is_read / is_claimed / is_trashedTINYINT(1)状态标记

索引:idx_recipient, idx_recipient_trashed, idx_expire, idx_send_time

amail_sent

字段类型说明
idINT AUTO_INCREMENT主键
sender_name / sender_displayVARCHAR发件人
mail_id / titleVARCHAR邮件ID/标题
target_type / target_valueVARCHAR目标
send_timeBIGINT发送时间
recipient_countINT收件人数
has_attachmentsTINYINT(1)是否有附件

构建方式

cd AdventureMail
mvn clean package
# 产物: target/AdventureMail-5.2.0.jar
依赖版本范围
Paper API1.21.4-R0.1-SNAPSHOTprovided
HikariCP5.1.0compile (shaded)
MySQL Connector/J8.3.0compile (shaded)

HikariCP 通过 maven-shade-plugin 重定位到 com.adventuremail.libs.hikari

Web 邮件编辑器

独立浏览器端工具,直接打开 web-editor/index.html。支持可视化编辑、附件管理、内置模板、Minecraft风格预览、输出YAML/命令。