无服务器搭建自己的邮局,支持多账号

无服务器搭建自己的邮局,支持多账号

前言

众所周知,大善人 CF 有免费的邮件路由系统,只要在 CF 托管 1 个域名,就可以拥有一个免费的域名邮箱,拥有无限子域,可无限收件

但是 CF 的邮件路由最大的短板是:没有发信功能(官方博客宣布近期将加入这一功能)。有些同学说无发信功能无所谓,其实有所谓,我就碰到过一个比较变态的国外服务商,用域名邮箱注册并收到验证码后,要求你用收件的邮箱回信发送此验证码,若发件邮箱与收验证码的邮箱不同,无法通过注册,即时使用第三方 SMTP 邮件服务器代发也无法通过

我曾经写过一个 定时群发邮件 的小项目,利用 Resend 的免费 API 实现了发信功能,但是这个项目是为了保活谷歌账号而产生的,功能非常有限。直到我发现了 cloud-mail 这个项目,CF 邮件路由Resend API 完美合体,现在就教大家来部署一下,过程相对比较复杂,因为要设置的东西比较多

所需资源

准备工作

1. 托管 1 个域名到 CF

这个就不讲了,长混互联网的应该都不知道,如果不知道可以搜索一下相关教程

我们假定这个域名是 mail.pp.ua

2. 获取自己 CF 账号的 ID

这个直接看 官方文档,非常简单,不详述

3. 获取自己 CF 账号的个人 API-KEY

这个也看 官方文档 吧。

重点强调:

  • 这个 API-KEY 必须要有 worker、pages、R2、D1、kv 的编辑权限,使用 CF 官方 编辑 Cloudflare Workers 的模板来创建 API-KEY 即可
  • API-KEY 只会显示 1 次,创建后立即保存下来备用

4. 创建 D1 数据库和 KV 存储并获取 ID

还是看 官方文档,其作用如下:

  • D1:作为项目的数据库
  • KV:用户项目缓存

5. 创建 R2 存储桶

R2 的作用:收发附件,如果不需要收发附件的功能,可以跳过这个步骤

看官方仓库的 issue,貌似部署时必须要 R2 参数,如果没有,部署会失败。而现在开通 R2 需要信用卡(只需绑卡并不收费,免费版有 10G 空间),有些同学可能没有信用卡,如果没有,R2_BUCKET_NAME 这个变量随意填一下,比如 mail;如果有,按此 官方文档 操作,并给你的存储桶绑定自定义域名,假设为 r2.mail.pp.ua几个重点需要说明一下

  • 需要在 R2 管理页面创建 R2 的 API TOKEN

1760343492726.webp

  • 创建一个 账户级别 的 API 令牌,而不是用户级别,应用于 所有存储桶,权限为 管理员读和写

1760343418110.webp

  • 记录下 R2 API 令牌的相关信息,包括以下内容:
    • 访问密钥 ID:xxxxxxxxxxxxxxxxx412df7886df27
    • 机密访问密钥:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx20a8db4b1dae4e3
    • S3 端点地址https://你的账户ID.r2.cloudflarestorage.com

6. 完成上述步骤后,将获得以下环境变量的参数,部署项目时需要用到

  • CLOUDFLARE_API_TOKEN=CF 账号的个人 API TOKEN
  • CLOUDFLARE_ACCOUNT_ID=CF 账号的 ID
  • D1_DATABASE_ID=D1 数据库 ID
  • KV_NAMESPACE_ID=KV 存储 ID
  • R2_BUCKET_NAME=R2 存储桶名称
  • DOMAIN=用于本项目收发邮件的域名,需要写成 json 格式,如 ["mail.pp.ua","mail.us.kg","mail.edu.kg"],如果只有一个域名,则写为 ["mail.pp.ua"]
  • ADMIN=本项目的管理账号,如 admin@mail.pp.ua
  • JWT_SECRET=随便写一串数字 + 字幕,无需记忆

开始部署

官方提供了 CF 部署的两种方式,一种是通过 github action 自动化部署,一种是通过 CF 的网页面板手动部署,这里推荐 github action 自动化部署。CF 的网页面板链接仓库部署 worker 有一个 BUG,绑定的 KV 和 D1 会掉绑

1. Fork 作者的项目

项目地址:GitHub - eoao/cloud-mail

2. 进入项目设置页,设置 Action 环境变量

也就是上文提到的 8 个变量,一一设置,然后运行 action,等待部署完成

mail01.jpg

mail02.jpg

mail03.jpg

mail04.jpg

3. 为域名开启邮件路由,实现收件功能

这个步骤直接看作者的 官方文档

mail005.png

mail05.png

mail06.png

mail07.png

mail08.png

4. 注册 Resend API,实现发信功能

看作者文档,已经写的非常详细了

该 API 免费层级只能绑定 1 个域名,每月发信上限为 1000 封

到此,部署其实已经完成了

以管理员身份登录

访问你部署的 worker 项目地址,以变量 ADMIN 设定的用户名注册,然后登录就是管理员账户

image.png

其他设置

关于设置部分大家就看官方文档吧,包括:

  • 附件收发
  • 邮件发送
  • 人机验证
  • TG 和其他邮箱转发

image.png

后话

我已咨询过作者,待 CF 邮件路由支持发信后,将第一时间支持该功能,届时就不再需要 Resend 的 API

#email #cloudflare