Cloud Mail部署教程:零成本自建邮箱服务

前言

Cloud Mail 是一个基于 Vue3 + Element Plus 前端框架和 Hono 后端框架开发的响应式邮箱服务。

它利用 Cloudflare Workers 的无服务器架构,结合 Resend 邮件推送服务,让你不需要任何服务器成本就能搭建属于自己的邮箱系统。


功能特点

功能 说明
💰 低成本使用 无需服务器,部署到 Cloudflare Workers,利用免费额度
💻 响应式设计 自动适配 PC 和移动端浏览器
📧 邮件发送 集成 Resend,支持群发、内嵌图片和附件
🛡️ 管理员功能 用户管理、邮件管理、RBAC 权限控制
🔀 多号模式 支持一个用户添加多个邮箱地址
📦 附件收发 使用 R2 对象存储保存和下载文件
🔔 邮件推送 接收邮件后可转发到 TG 机器人或其他邮箱
🤖 人机验证 集成 Turnstile 验证,防止批量注册
📡 开放 API 支持 API 批量生成用户,多条件查询邮件
📈 数据可视化 使用 Echarts 对系统数据可视化显示

技术栈

类别 技术
前端框架 Vue3 + Element Plus
后端框架 Hono
ORM Drizzle
运行平台 Cloudflare Workers
邮件服务 Resend
缓存 Cloudflare KV
数据库 Cloudflare D1
文件存储 Cloudflare R2

准备工作

在开始部署之前,需要准备以下内容:

1. Cloudflare 账号

注册 Cloudflare 并添加你的域名。需要获取以下信息:

  • Account ID — 在 Cloudflare Dashboard 右侧的账户页面中可以找到
  • API Token — 进入 API Tokens → 创建令牌 → 选择”编辑 Cloudflare Workers”模板,添加 Workers、KV、D1、R2 等资源的读写权限。API Token 只会显示一次,创建后立即保存

2. GitHub 账号

用于 Fork 仓库和配置 GitHub Actions 自动部署。

3. Resend 账号

注册 Resend 用于发送邮件。免费版支持 1 个域名和每月 1000 封邮件。

4. 域名

一个托管在 Cloudflare 上的域名(例如 mail.example.com),用于访问邮箱服务。


创建 Cloudflare 资源

在 Cloudflare Dashboard 中创建以下资源:

D1 数据库

进入 Workers 和 PagesD1创建数据库,输入名称后创建。记下 数据库 ID

KV 命名空间

进入 Workers 和 PagesKV创建命名空间,输入名称后创建。记下 命名空间 ID

R2 存储桶

进入 R2创建存储桶,输入名称后创建。R2 需要绑定信用卡,免费额度 10GB 足够日常使用。

获取 R2 API 凭证:

  • Access Key IDSecret Access Key
  • S3 Endpointhttps://你的账户ID.r2.cloudflarestorage.com

💡 如果不想绑定信用卡,可以创建一个占位桶名称,部署时填入 R2 参数。但附件功能将不可用。


方式一:GitHub Actions 一键部署(推荐)

1. Fork 仓库

访问 cloud-mail 项目,点击 Fork 将仓库克隆到你的 GitHub 账号下。

2. 配置 GitHub Secrets

进入你的 Fork 仓库 → SettingsSecrets and variablesActionsNew repository secret,添加以下 8 个 Secrets:

Secret 名称 必需 说明
CLOUDFLARE_API_TOKEN Cloudflare API 令牌(需要 Workers、KV、D1、R2 等权限)
CLOUDFLARE_ACCOUNT_ID Cloudflare 账户 ID
D1_DATABASE_ID D1 数据库 ID
KV_NAMESPACE_ID KV 命名空间 ID
R2_BUCKET_NAME R2 存储桶名称(没有信用卡也填一个占位名称)
DOMAIN 邮箱域名,JSON 数组格式,例如 ["mail.example.com"],多域名用逗号分隔
ADMIN 管理员邮箱,例如 admin@example.com
JWT_SECRET JWT 加密密钥,随机长字符串(不要包含特殊字符)

3. 运行工作流

  1. 进入你的 Fork 仓库 → Actions 页面
  2. 手动运行工作流(首次需手动触发)
  3. 等待部署完成(约 2-3 分钟)
  4. 部署成功后,进入 Worker 设置页面绑定自定义域名

4. 配置 Cloudflare Email Routing

  1. 进入 Cloudflare Dashboard → EmailEmail Routing
  2. 配置 Catch-All 规则,将所有邮件转发到你的 Worker
  3. 具体配置步骤参考 官方文档

5. 初始化并使用

  1. 访问你的 Worker 域名
  2. 使用 ADMIN 变量中设置的邮箱注册账号
  3. 第一个注册的账号自动成为管理员

方式二:Cloudflare Dashboard 手动部署

1. 创建 Worker

  1. 登录 Cloudflare Dashboard → Workers 和 Pages创建应用程序Worker
  2. 输入 Worker 名称(例如 cloud-mail
  3. 选择 GitHub 导入,连接你的 Fork 仓库
  4. 设置构建目录为 mail-worker
  5. 点击 保存并部署

2. 设置环境变量

在 Worker 详情页 → 设置环境变量,添加以下变量:

变量名 示例值
domain ["mail.example.com"]
admin admin@example.com
jwt_secret 随机字符串(不要包含特殊字符)

3. 绑定数据库

在 Worker 详情页 → 设置绑定,添加:

  • KV 命名空间:变量名必须为 kv
  • D1 数据库:变量名必须为 db

⚠️ 变量名必须为 kvdb,不可更改。Cloudflare UI 绑定的 KV 和 D1 有时会掉绑,建议使用 GitHub Actions 部署。

4. 绑定自定义域名

在 Worker 详情页 → 触发器自定义域名,添加你的域名。

5. 初始化数据库

访问 https://你的域名/api/init/你的jwt_secret 初始化数据库。


配置 Resend 发送邮件

  1. 登录 Resend
  2. 添加并验证你的域名(需要配置 DNS 记录)
  3. 创建 API Key
  4. 在 Cloud Mail 后台 → 系统设置邮件服务,填入 Resend API Key

配置 Turnstile 人机验证(可选)

  1. 在 Cloudflare Dashboard → Turnstile添加站点
  2. 获取 Site Key 和 Secret Key
  3. 在 Cloud Mail 后台 → 系统设置安全设置 中配置

配置邮件推送(可选)

Cloud Mail 支持接收邮件后推送到 Telegram 或其他邮箱:

  1. 创建 Telegram Bot 获取 Token
  2. 获取你的 Chat ID
  3. 在 Cloud Mail 后台 → 系统设置邮件推送 中配置

常见问题

部署后访问空白?

检查 KV 和 D1 数据库是否已正确绑定,变量名必须为 kvdb

R2 绑定失败?

R2 需要绑定信用卡才能正常使用。如果不需要附件功能,可以填一个占位桶名称。

邮件发送失败?

检查 Resend API Key 是否正确,域名是否已在 Resend 中验证通过。

如何更新?

如果是 GitHub Actions 部署,同步上游仓库后会自动重新部署。


参考资料