Skip to content

feat: add mailbox subdomain support#108

Open
gloryhry wants to merge 1 commit intobeilunyang:masterfrom
gloryhry:master
Open

feat: add mailbox subdomain support#108
gloryhry wants to merge 1 commit intobeilunyang:masterfrom
gloryhry:master

Conversation

@gloryhry
Copy link
Copy Markdown

@gloryhry gloryhry commented Apr 3, 2026

背景

当前系统创建邮箱时仅支持基础域名,无法直接创建带子域名的邮箱地址。
本次改动为邮箱创建流程增加了可选子域名支持,使用户可以创建类似:

的邮箱地址。

主要改动

1. 后端

  • POST /api/emails/generate 新增可选参数 subdomain
  • 增加子域名标准化与格式校验
  • 统一通过完整邮箱地址生成与查重
  • 新增 app/lib/email-address.ts,抽离域名/子域名拼装逻辑

2. Web 端

  • 创建邮箱弹窗新增“子域名”输入项
  • 实时预览完整邮箱地址
  • 增加前端子域名格式校验与错误提示

3. CLI

  • moemail create 新增参数:
    • --subdomain
  • CLI 调用后端接口时透传子域名参数

4. 文档

  • 更新中英文 README
  • 更新 CLI README 与 skill 文档
  • 增补“子域名部署清单”章节
  • 更新站内 API 示例

行为说明

  • EMAIL_DOMAINS 仍然配置基础域名
  • subdomain 为可选项
  • 不填 subdomain 时,行为与旧版本保持一致
  • 填写后生成地址格式为:name@subdomain.domain

兼容性

  • 不修改数据库结构
  • 不影响现有邮箱数据
  • 收件、发件、分享、Webhook 仍基于完整邮箱地址工作

部署注意事项

  • Cloudflare Email Routing 需要确认能覆盖子域名地址
  • 若使用发信服务(如 Resend),需要确认是否要求对子域名单独验证

@gloryhry
Copy link
Copy Markdown
Author

gloryhry commented Apr 8, 2026

在Cloudflare部署上支持子域名配置

在 DNS 记录中强行添加“通配符 MX 记录”

Cloudflare 的邮件路由界面不支持泛解析,直接去域名的 DNS 管理页面手动添加。

  1. 进入 Cloudflare 控制台,打开你的主域名(例如 example.com),点击左侧的 “DNS” → “记录”。
  2. 查看你当前主域名的 MX 记录,记下指向 Cloudflare 邮件服务器的三个地址和优先级(Priority)。
  3. 点击“添加记录”,添加三条通配符 MX 记录(将名称直接填入 *,代表所有未定义的子域):
   类型:MX | 名称:* | 邮件服务器:route1.mx.cloudflare.net | 优先级:(填你实际的,如 86)
   类型:MX | 名称:* | 邮件服务器:route2.mx.cloudflare.net | 优先级:(填你实际的,如 65)
   类型:MX | 名称:* | 邮件服务器:route3.mx.cloudflare.net | 优先级:(填你实际的,如 99)
  1. 再添加一条通配符 TXT (SPF) 记录,防止别人给你发邮件时被退信:
   类型:TXT | 名称:* | 内容:v=spf1 include:_spf.mx.cloudflare.net ~all

开启主域名的 Catch-all (全部捕获)(新配置需要,已部署的不需要以下操作)

由于发给任意子域名(例如 test@abc.example.com)的邮件,在系统中找不到特定的收件规则,我们需要用 Catch-all 功能把它们统一拦截并交给 Worker 处理。

  1. 在左侧菜单进入 “电子邮件” → “电子邮件路由” → “路由规则” 选项卡。
  2. 将页面滚动到最下方的 “Catch-all 地址”(通配符地址)。
  3. 状态设为开启,操作选择 “发送到 Worker” (Send to a Worker)。
  4. 目标选择你已经部署好的临时邮箱 Worker 程序。

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