Cloud Mail 是一个基于 Cloudflare Workers 的临时邮箱解决方案,非常适合用来「消耗闲置域名」,或者在注册、测试等场景中快速使用一个干净的邮箱系统。

不过官方部署流程相对偏复杂,对 Cloudflare、Wrangler、环境变量等有一定要求,新手很容易在中途卡住。

因此这篇文章将完全基于 GitHub Actions,带你从 Fork 仓库开始,一步步完成部署,不需要在本地配置开发环境,几乎是「点点点」就能跑起来。

在开始之前,请确保你已经具备以下条件:

  • 一个 Cloudflare 账户(已添加域名)
  • 一个 GitHub 账户

如果你正好有闲置域名、又想搭一个可控的临时邮箱系统,那么欢迎阅读这篇文章。

项目介绍

Cloud Mail 是一个用于 利用闲置域名搭建临时邮箱系统 的开源项目,在注册验证、测试环境、隐私保护等场景下都非常实用。

需要注意的是,该项目具备完整的邮件接收与发送能力,部署后务必做好鉴权与访问控制,避免被滥用或用于非法用途。

项目地址如下:

由于 Cloud Mail 的完整部署流程相对复杂,本文将仅介绍基于 GitHub Actions 的部署方式,也是目前最省心、最不容易踩坑的一种方案。

以下是效果预览:

配置 Github 仓库

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

Fork仓库

  1. 仓库页面 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密钥 随便输入一串字符串

添加secrets

获取 Cloudflare API 令牌

  1. 访问Cloudflare
  2. 点击 创建令牌

获取 Cloudflare API

  1. 选择编辑 Cloudflare Workers模板

选择 Cloudflare Workers

  1. 参照下表添加相应权限

添加权限

  1. 保存并复制生成的令牌设置到 GitHub Secrets 中的 CLOUDFLARE_API_TOKEN

获取 Cloudflare 账户 ID

  1. 访问 CloudFlare 账户主页
  2. 复制账户ID到 GitHub Secrets 中的 CLOUDFLARE_ACCOUNT_ID

复制账户ID

获取 数据库 ID

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

获取 D1 数据库 ID

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

获取 KV 数据库 ID

  1. 创建 R2 对象存储,设置自定义域,复制桶名到 GitHub Secrets 中的 R2_BUCKET_NAME (可选)

需要注意的是,R2 对象存储在启用免费额度前需要绑定信用卡。
对于中小规模使用场景,Cloudflare 提供的免费额度基本足够。

由于本文环境未绑定信用卡,这里不再展开演示,感兴趣的读者可以自行查阅 Cloudflare 官方文档或相关教程。

运行 Github Actions

  1. 启用 Github Actions

启用 Github Action

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

运行 Github Action

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

绑定自定义域

后续同步仓库后会自动部署到 Workers, 自动同步仓库可使用 Bot 或者手动点击 Sync Upstream 按钮

系统功能设置

登录管理员账号(上文设置的secretsadmin),进入系统设置

登录账号

启用邮件接收

打开Cloudflare控制台,点击左侧菜单中的账户主页,再点你的域名

点击域名

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

开始使用

跳过指南

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

启用电子邮件路由

添加记录并启用

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

启用Catch-all地址

编辑 catch-all 地址 进行以下设置:

  • 操作:发送到 Worker
  • 目标:cloud-mail(你部署的worker名字)

点击 保存

编辑Catch-all地址

设置完成后应该是这样的

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

测试接收

附件转发(可选)

这一部分主要是解决接收附件和发送附件,如果不需要可以跳过

这里如果没有r2存储也可以使用kv存储。

如果你设置的是kv存储,访问域名就设置为worker的自定义域

下面分辨给出r2和kv的设置教程,二选一即可

R2 存储

找到R2对象存储,选择概述,创建存储桶

创建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(这里只会显示一次,别弄丢了)

添加API Key

复制API key

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

Resend Token

再次打开Resend,点击左侧菜单栏的 Webhooks,新增一个回调接口。

  • Endpoint URL(回调URL):https://你的项目自定义域/api/webhooks
  • Events types:选中下图对应选项

Webhooks

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 数组格式,例如:
    ["example.com"]
  • 新增或修改 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 一起排查。

祝你部署顺利,少踩坑 ✨