type
status
date
slug
summary
tags
category
icon
password
使用 Cloudflare email worker 实现的临时电子邮件服务
⭐特点
- ✨ 隐私友好,无需注册,开箱即用
- ✨ 更好的 UI 设计,更加简洁
- 🚀 快速部署,无需服务器
原理:
- Email worker 接收电子邮件
- 前端显示电子邮件(remix)
- 邮件存储(sqlite)
worker接收电子邮件 -> 保存到数据库 -> 客户端查询电子邮件
⭐自部署教程
准备工作
- Cloudflare 账户与托管在 Cloudflare 上的域名
- turso sqlite 数据库(个人免费计划足够)
接收邮件教程
1.注册一个 turso 账户,创建数据库,并创建一个
emails
表然后,创建一个名为
emails
的表。选择您的数据库,您会看到“编辑表”按钮,点击并进入:
发现网页版好像新建不了表,所以我们使用turso 提供的 cli 来初始化表
Linux (或 mac/windows) 终端执行:
执行完上方第一行代码后重启终端(Linux服务器),执行第二行代码按照提示登录,如果无法调用浏览器进行登录,则可以使用
然后将登陆后的export内容粘贴到终端回车,然后将上方最后一行代码改成你创建的数据库名称后执行。
然后执行下方sql脚本
将sql脚本复制到网页的SQL runner运行(需要修改字段)
2.部署 email worker
在
vmail/apps/email-worker/wrangler.toml
文件中填写必要的环境变量。- TURSO_DB_AUTH_TOKEN(第1步中的turso表信息,点击“Generate Token”)
- TURSO_DB_URL(例如 libsql://db-name.turso.io)
- EMAIL_DOMAIN (域名,如 vmail.dev)
如果您不执行此步骤,可以在Cloudflare的 worker settings 中添加环境变量
然后运行命令:
发布如果遇到问题或可直接新建workers添加下面的代码试试
本人踩坑经历windows cmd执行报错无法成功npx wrangler login,在VMware 安装 Ubuntu,在虚拟机环境中执行操作解决。
3.配置电子邮件路由规则
设置“Catch-all”操作为发送到 email worker:
这里在部署的时候遇到一个问题:状态一直处理类似加载中的状态
解决方案
保存以后你会发现状态处于活动或者disable状态,然后继续编辑改回发送到Worker,选择email-worker,保存以后如果是disable状态的话手动开启即可!!!
4.在 Vercel 或 fly.io 上部署 Remix 应用程序
确保在部署时准备并填写以下环境变量(
.env.example
):变量名 | 说明 | 示例 |
COOKIES_SECRET | 必填,cookie加密密钥,随机字符串 | 12345abcde |
TURSO_DB_RO_AUTH_TOKEN | 必填,turso数据库只读凭据 | my-turso-db-ro-auth-token |
TURSO_DB_URL | 必填,turso数据库URL | libsql://db-name.turso.io |
EMAIL_DOMAIN | 必填,域名后缀,支持多个 | vmail.dev,meetu.dev |
EXPIRY_TIME | 可选,邮箱过期时间,单位秒,默认86400 | 86400 |
TURNSTILE_KEY | 可选,网站验证所需的 Turnstile Key | my-turnstile-key |
TURNSTILE_SECRET | 可选,网站验证所需的 Turnstile Secret | my-turnstile-secret |
获取
TURNSTILE_KEY
、TURNSTILE_SECRET
请前往 cloudflare 控制台 https://dash.cloudflare.com/[account-id]/turnstile关于TURNSTILE_KEY
、TURNSTILE_SECRET
配置
添加站点,站点名称自己定、域填写主域(二级域名没试过可以自己尝试是否可用),其他选项默认即可
Vercel:
推荐使用一键部署按钮(此操作会在你的github账户中自动创建vmail仓库并关联部署到vercel):
或手动将代码推送到你的 Github 仓库,并在 Vercel 面板中创建项目。选择
New project
,然后导入对应的 Github 仓库,填写环境变量,选择 Remix
框架,点击 Deploy
,等待部署完成。部署完后继续点击 Countinu to Dashboard,进入 Settings -> General,修改下面设置:
然后进入 Deployments 重新部署一次,或向 github 推送代码重新触发部署。
fly.io:
5.部署成功后在 cloudflare 添加域名解析(A记录)到对应平台,就可以愉快的玩耍了
vercel 演示如何解析:
发送邮件教程
准备工作
- 继续使用收件教程中托管到 cf 的域名
- DKIM(可选)
1. 创建发件 worker
这里使用手动创建的方式:
- 进入 Cloudflare 控制台
https://dash.cloudflare.com/
,点击侧边栏Workers 和 Pages
- 点击
创建应用程序
->创建 worker
-> 名称随意,比如sender
-> 点击部署
- 进入到该 worker,点击
编辑代码
,将代码 send-worker.js 粘贴进去并保存部署
- 在 worker 的
设置
->变量
中添加以下变量:
变量名 | 说明 | 示例 |
DKIM_DOMAIN | 可选,域名后缀 | vmail.dev |
DKIM_PRIVATE_KEY | 可选,DKIM 私钥 | MIIEpQIBAAKCAQEA... |
DKIM_SELECTOR | 可选,固定值 mailchannels | mailchannels |
DKIM_PRIVATE_KEY
后续会提到如何获取。记住 worker 分配的地址,即
https://<worker-name>.<your-name>.workers.dev
,后面会用到。send-worker.js
代码
该地址可在Workers 选中sender 设置→触发器中查看
2. 准备 DKIM 私钥(可选)
DKIM 是一种电子邮件认证技术,可以验证邮件的发送者身份。
在终端执行下面的命令,生成 DKIM 私钥,参考 Adding-a-DKIM-Signature:
可在windows环境下Git Bash中执行生成
这两条命令会生成3个文件:
private_key.pem
:私钥文件
private_key.txt
:私钥文件,base64 编码
dkim_record.txt
:DKIM 记录
其中
private_key.txt
文件中的内容就是上一步 DKIM_PRIVATE_KEY
变量的值。3. 配置 DNS
进入 Cloudflare 托管域名控制台,选择你的域名 -> 点击
DNS
,接下来,需要添加3条TXT记录并修改1条TXT记录。新增的如下:
类型 | 名称 | 值 | 备注 |
TXT | _dmarc | v=DMARC1; p=reject; adkim=s; aspf=s; rua=mailto:YYY; ruf=mailto:YYY pct=100; fo=1; | 固定值 |
TXT | mailchannels._domainkey | v=DKIM1;p=MIIEpQIBAAKCAQEA... | 值为 dkim_record.txt 文件的内容 |
TXT | _mailchannels | v=mc1 cfid=yesmore.workers.dev | 将其中的 yesmore 修改为你的账号名称 |
需要修改的如下(TXT记录值为
example.com
即你的域名的那条):类型 | 名称 | 值 | 备注 |
TXT | example.com | v=spf1 include:_spf.mx.cloudflare.net include:relay.mailchannels.net ~all | 把值替换为这个,其他不动 |
最后一共4条TXT记录:
4. 验证发送
方法一:打开网页
https://<sender-name>.<your-name>.workers.dev/submit
验证是否可以正常发送方法二:使用 API 发送
- 请求地址
https://<sender-name>.<your-name>.workers.dev
- 请求方法
POST
- 请求体:
示例:
5. 添加环境变量
此项目使用第4步中的方法二通过 API 发送邮件。
在 Vercel 项目控制台中,进入
Settings
-> Environment Variables
,添加以下变量:- SEND_WORKER_URL:值为
https://<sender-name>.<your-name>.workers.dev
添加后重新触发部署一次即可。
- 作者:IMyself
- 链接:https://blog.lmyself.top//article/52063044-c94b-4c1c-b8b0-8044dccbca65
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。