使用 GitHub Actions 部署 Cloud Mail 临时邮箱系统
Cloud Mail 是一个基于 Cloudflare Workers 的临时邮箱解决方案,非常适合用来「消耗闲置域名」,或者在注册、测试等场景中快速使用一个干净的邮箱系统。
不过官方部署流程相对偏复杂,对 Cloudflare、Wrangler、环境变量等有一定要求,新手很容易在中途卡住。
因此这篇文章将完全基于 GitHub Actions,带你从 Fork 仓库开始,一步步完成部署,不需要在本地配置开发环境,几乎是「点点点」就能跑起来。
在开始之前,请确保你已经具备以下条件:
- 一个 Cloudflare 账户(已添加域名)
- 一个 GitHub 账户
如果你正好有闲置域名、又想搭一个可控的临时邮箱系统,那么欢迎阅读这篇文章。
项目介绍
Cloud Mail 是一个用于 利用闲置域名搭建临时邮箱系统 的开源项目,在注册验证、测试环境、隐私保护等场景下都非常实用。
需要注意的是,该项目具备完整的邮件接收与发送能力,部署后务必做好鉴权与访问控制,避免被滥用或用于非法用途。
项目地址如下:
由于 Cloud Mail 的完整部署流程相对复杂,本文将仅介绍基于 GitHub Actions 的部署方式,也是目前最省心、最不容易踩坑的一种方案。
以下是效果预览:


配置 Github 仓库
- 点击 Fork 该仓库 https://github.com/eoao/cloud-mail

- 仓库页面
Settings->Secrets and variables->Actions->Repository secrets, 添加以下secrets:(部分secrets会在下文说明如何获取)
提示:下表中的 Cloudflare 相关 ID(Account / D1 / KV / R2)均可在 Cloudflare 控制台中获取,本文后续会分别演示获取方式。
| Secret 名称 | 必需 | 用途 |
|---|---|---|
CLOUDFLARE_API_TOKEN |
✅ | Cloudflare API 令牌获取API令牌 |
CLOUDFLARE_ACCOUNT_ID |
✅ | Cloudflare 账户 ID获取账户ID |
D1_DATABASE_ID |
✅ | D1 数据库的 ID获取数据库ID |
KV_NAMESPACE_ID |
✅ | KV 命名空间的 ID获取数据库ID |
R2_BUCKET_NAME |
❌ | R2 存储桶的名称获取数据库ID |
DOMAIN |
✅ | 邮箱域名,多域名用(例如["example.com","example2.com"]) |
ADMIN |
✅ | 管理员邮箱地址(例如[email protected]) |
JWT_SECRET |
✅ | JWT密钥 随便输入一串字符串 |

获取 Cloudflare API 令牌
- 访问Cloudflare
- 点击
创建令牌

- 选择
编辑 Cloudflare Workers模板

- 参照下表添加相应权限

- 保存并复制生成的令牌设置到 GitHub Secrets 中的
CLOUDFLARE_API_TOKEN
获取 Cloudflare 账户 ID
- 访问 CloudFlare 账户主页
- 复制账户ID到 GitHub Secrets 中的
CLOUDFLARE_ACCOUNT_ID

获取 数据库 ID

- 创建 D1 数据库,复制ID到 GitHub Secrets 中的
D1_DATABASE_ID

- 创建 KV 数据库,复制ID到 GitHub Secrets 中的
KV_NAMESPACE_ID

- 创建 R2 对象存储,设置自定义域,复制桶名到 GitHub Secrets 中的
R2_BUCKET_NAME(可选)
需要注意的是,R2 对象存储在启用免费额度前需要绑定信用卡。
对于中小规模使用场景,Cloudflare 提供的免费额度基本足够。
由于本文环境未绑定信用卡,这里不再展开演示,感兴趣的读者可以自行查阅 Cloudflare 官方文档或相关教程。
运行 Github Actions
- 启用 Github Actions

- 在 Actions 页面手动运行工作流开始部署

- 在 Cloudflare 界面找到部署完成后自动生成的 Worker,设置自定义域用于访问网站

后续同步仓库后会自动部署到 Workers, 自动同步仓库可使用 Bot 或者手动点击 Sync Upstream 按钮
系统功能设置
登录管理员账号(上文设置的secrets的admin),进入系统设置

启用邮件接收
打开Cloudflare控制台,点击左侧菜单中的账户主页,再点你的域名

此时,左侧菜单栏会发生变化。依次点击 电子邮件 -> 电子邮件路由 -> 开始使用 -> 跳过入门指南


点击 启用电子邮件路由 -> 添加记录并启用


点击路由规则分栏,在 Catch-all 地址 的地方,将状态设置为活动,之后再点击右侧的编辑

在 编辑 catch-all 地址 进行以下设置:
- 操作:发送到 Worker
- 目标:cloud-mail(你部署的worker名字)
点击 保存

设置完成后应该是这样的

至此邮件接收已经设置完成,可以进行测试啦

附件转发(可选)
这一部分主要是解决接收附件和发送附件,如果不需要可以跳过
这里如果没有r2存储也可以使用kv存储。
如果你设置的是kv存储,访问域名就设置为worker的自定义域
下面分辨给出r2和kv的设置教程,二选一即可
R2 存储
找到R2对象存储,选择概述,创建存储桶

桶名字可以随便填,位置可以选择离你近的地方,或根据自己的需要选择。

设置R2存储桶的自定义域名(不要设置与worker自定义域一样)


之后在临时邮箱网站的系统设置里,编辑对象存储的访问域名,改为刚刚设置的R2存储桶的自定义域名

回到worker绑定刚才创建的r2存储桶,r2存储桶变量名为:r2

KV 存储
找到存储和数据库,选择Workers KV,点击右上角的Create Instance。命名空间名称随意填写,之后点击创建。
在临时邮箱网站的系统设置里,编辑对象存储的访问域名,改为Worker的自定义域名(就是你的网站域名)。
回到worker绑定刚才创建的KV,KV 命名空间 改为:kv
邮件发送
目前 Cloud Mail 仅支持通过第三方服务 Resend 发送邮件。
请先访问 https://resend.com 注册或登录账户,然后在后台添加你的邮箱域名。
点击左侧的Domain,再点击Add Domain,之后输入:
Name:你的域名Region:选择一个离你近的地方
再次点击 Add Domain

再设置DNS Records,点击Sign in to Cloudflare,会跳转到Cloudflare的授权界面,点击授权。
授权后等待验证完成。下图是验证完后的样子

在左侧菜单栏点击 API Key,点击Create API Key,名字随意,点击Add,然后复制 API Key(这里只会显示一次,别弄丢了)


回到项目网站的系统设置,在邮箱设置里点击 Resend Token,选择对应的域名,粘贴刚刚复制的Key。

再次打开Resend,点击左侧菜单栏的 Webhooks,新增一个回调接口。
- Endpoint URL(回调URL):https://你的项目自定义域/api/webhooks
- Events types:选中下图对应选项

Turnstile 人机验证
Turnstile 人机验证 主要目的是防止网站被机器人批量注册
打开Cloudflare,点击左侧菜单栏的 Turnstile,点击添加小组件
小组件名字随便填,点击添加主机名,选择你的域名

然后点击右下角的创建。随后会出现两个秘钥,填到项目网站系统设置的Turnstile 人机验证 里:
- Site Key:填入站点秘钥
- Secret Key:填入秘钥

LinuxDo 登录
LinuxDo 登录主要用于为 Cloud Mail 提供第三方身份认证能力,适合部署在小圈子或社区环境中。如果你不需要第三方登录功能,可以直接跳过本节。
设置回调地址
打开 https://connect.linux.do 后,点击我的应用接入,再点击申请新接入
- 应用名:随便填
- 应用主页:可以填自己项目地址,用于显示
- 应用描述:随便填
- 回调地址:
https//你的worker自定义域名/login

设置环境变量
仓库页面 Settings -> Secrets and variables -> Actions -> Repository secrets, 添加以下 secrets:
| Worker Secret | Action Secret | 用途 |
|---|---|---|
linuxdo_client_id |
LINUXDO_CLIENT_ID |
Client Id |
linuxdo_client_secret |
LINUXDO_CLIENT_SECRET |
Client Secret |
linuxdo_callback_url |
LINUXDO_CALLBACK_URL |
回调地址https//你的worker自定义域名/login |
linuxdo_switch |
LINUXDO_SWITCH |
true 或 false 用于开启或关闭登录 |
常见问题(Q&A)
Q1:部署完成后,页面可以访问,但邮箱收不到邮件怎么办?
A:
请优先检查 Cloudflare 的 邮件路由(Email Routing) 是否已正确启用,重点关注以下几点:
- 域名下是否已启用「电子邮件路由」
- 是否已添加并启用 Catch-all 地址
- Catch-all 的操作是否设置为「发送到 Worker」
- 目标 Worker 是否为你部署的
cloud-mail
此外,首次配置完成后,DNS 和邮件路由可能存在短暂延迟,建议等待几分钟后再测试。
Q2:GitHub Actions 显示部署成功,但访问网站时报 500 错误?
A:
这种情况大多与 Secrets 配置错误 有关,建议重点排查:
- Secrets 名称是否与文档完全一致(区分大小写)
DOMAIN是否为合法的 JSON 数组格式,例如:- 新增或修改 Secrets 后,是否重新手动运行了一次 GitHub Actions
如果以上都确认无误,可以在 Cloudflare Workers 后台查看运行日志进一步排查。
Q3:R2 需要绑定信用卡吗?免费额度够用吗?
A:
R2 在启用免费额度前需要绑定信用卡。
对于个人使用或小规模临时邮箱场景,Cloudflare 提供的免费额度通常已经足够。
如果你不方便绑定信用卡,可以选择 KV 存储 或直接不启用附件功能。
Q4:配置了 Resend,但邮件发送失败怎么办?
A:
请依次检查以下内容:
- Resend 中的域名是否已验证成功
- DNS 记录是否已正确同步到 Cloudflare
- 项目系统设置中的 Resend Token 是否填写正确
- 是否已正确配置 Webhook 回调地址:
1 | https://你的项目自定义域/api/webhooks |
另外,API Key 只会显示一次,如丢失需重新生成。
Q7:后续修改配置后,需要重新部署吗?
A:
- 仅修改 Cloudflare 后台配置(如邮件路由、R2 绑定等):
不需要重新部署。 - 修改 GitHub Secrets 或仓库代码:
需要重新运行 GitHub Actions 才会生效。
总结
到这里,Cloud Mail 的基础部署与核心功能配置就已经完成了。
通过 GitHub Actions + Cloudflare Workers 的方式,你可以几乎零成本地维护一个可用、可控的临时邮箱系统。
如果本文对你有所帮助,欢迎在评论区交流;
如果你在部署过程中遇到问题,也可以结合官方仓库的 Issues 一起排查。
祝你部署顺利,少踩坑 ✨






