cloudflare临时邮箱创建指南
zhouzhou Lv3
写在前面:因为cli和UI部署不方便更新,而且也有点过于繁琐,所以写了如何使用Github Action部署,在部署过程中也是遇到了很多莫名其妙的报错,最终有了这份成功的经验

功能说明:

  1. 收发件功能
  2. 用户注册
  3. 用户角色(admin,vip,user)
  4. admin,vip可无限发件,user需管理员后台设置
  5. 未启用webhook
  6. 未启用网站访问密码

事先准备:

cloudflare操作

1. 创建D1数据库

  • 进入cloudflare控制台,找到储存和数据库,展开看到D1 SQL 数据库
  • 创建新的数据库,记录名称和ID
    image
  • 进入新的D1数据库-控制台,将下列代码块复制到输入框,点击执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
CREATE TABLE IF NOT EXISTS raw_mails (
id INTEGER PRIMARY KEY,
message_id TEXT,
source TEXT,
address TEXT,
raw TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_raw_mails_address ON raw_mails(address);

CREATE TABLE IF NOT EXISTS address (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_address_name ON address(name);

CREATE TABLE IF NOT EXISTS auto_reply_mails (
id INTEGER PRIMARY KEY,
source_prefix TEXT,
name TEXT,
address TEXT UNIQUE,
subject TEXT,
message TEXT,
enabled INTEGER DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_auto_reply_mails_address ON auto_reply_mails(address);

CREATE TABLE IF NOT EXISTS address_sender (
id INTEGER PRIMARY KEY,
address TEXT UNIQUE,
balance INTEGER DEFAULT 0,
enabled INTEGER DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_address_sender_address ON address_sender(address);

CREATE TABLE IF NOT EXISTS sendbox (
id INTEGER PRIMARY KEY,
address TEXT,
raw TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_sendbox_address ON sendbox(address);

CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
user_email TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
user_info TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_users_user_email ON users(user_email);

CREATE TABLE IF NOT EXISTS users_address (
id INTEGER PRIMARY KEY,
user_id INTEGER,
address_id INTEGER UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_users_address_user_id ON users_address(user_id);

CREATE INDEX IF NOT EXISTS idx_users_address_address_id ON users_address(address_id);

CREATE TABLE IF NOT EXISTS user_roles (
id INTEGER PRIMARY KEY,
user_id INTEGER UNIQUE NOT NULL,
role_text TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_user_roles_user_id ON user_roles(user_id);

CREATE TABLE IF NOT EXISTS user_passkeys (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
passkey_name TEXT NOT NULL,
passkey_id TEXT NOT NULL,
passkey TEXT NOT NULL,
counter INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX IF NOT EXISTS idx_user_passkeys_user_id ON user_passkeys(user_id);

CREATE UNIQUE INDEX IF NOT EXISTS idx_user_passkeys_user_id_passkey_id ON user_passkeys(user_id, passkey_id);

image

3. 创建kv空间

  • 同样在储存和数据库-找到KV
  • 创建新的KV空间,记录名称和ID

4. 创建前端页面

5. 配置邮件转发

Github操作

1. Fork官方项目

2. 打开仓库的 Actions 页面,找到 Deploy Backend Production 和 Deploy Frontend,点击 enable workflow 启用 workflow,这里并不是运行!!!

3. 然后在仓库页面 Settings -> Secrets and variables -> Actions -> Repository secrets, 添加以下 secrets(变量名和变量):

  • CLOUDFLARE_ACCOUNT_ID
    • Workers 和 Pages页面右侧复制
      image
  • CLOUDFLARE_API_TOKEN
    • Workers 和 Pages页面管理API令牌创建一个api
    • 你的cloudflare api,建议至少要有workers、D1、Pages、KV的权限
  • BACKEND_TOML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
name = "cloudflare_temp_email"
main = "src/worker.ts"
compatibility_date = "2024-09-23"
compatibility_flags = [ "nodejs_compat" ]

# 如果你想使用自定义域名,你需要添加 routes 配置,这里的域名是后端api的域名
routes = [
{ pattern = "mail-backend.example.com", custom_domain = true },
]

# 如果你想要使用定时任务清理邮件,取消下面的注释,并修改 cron 表达式
# [triggers]
# crons = [ "0 0 * * *" ]

# 通过 Cloudflare 发送邮件
# send_email = [
# { name = "SEND_MAIL" },
# ]

[vars]
# 邮箱名称前缀,不需要后缀可配置为空字符串或者不配置
PREFIX = ""
# 用于临时邮箱的所有域名, 支持多个域名,你所持有的根域名
DOMAINS = ["example.com"]

JWT_SECRET = "8ae****************8de2a"

# admin 控制台密码, 不配置则不允许访问控制台
ADMIN_PASSWORDS = ["your password"]

# 这里给了一个空数组,也就是说没有登录的用户没有可用的域名,如果你想给没有登录的用户使用域名,你可以加上自己的域名[“各自域名”] 它是一个数组也可以多个
DEFAULT_DOMAINS = [""]

# 是否允许自动回复邮件,不配置则不允许
ENABLE_AUTO_REPLY = false

# 是否允许用户创建邮件, 不配置则不允许
ENABLE_USER_CREATE_EMAIL = true

# 允许用户删除邮件, 不配置则不允许
ENABLE_USER_DELETE_EMAIL = true

# 默认发送邮件余额,如果不设置,将为 0
DEFAULT_SEND_BALANCE = "1"

# 用于发件的api key,从resend网站获取,官方不建议在这里填写,需要手动在后端workers里配置:种类-纯文本、变量名-RESEND_TOKEN、值-re_9B1************sC2fx6zNzR,不需要""
RESEND_TOKEN = "re_9B1************sC2fx6zNzR"

# admin 角色配置, 如果用户角色等于 ADMIN_USER_ROLE 则可以访问 admin 控制台
ADMIN_USER_ROLE = "admin"


# 可以无限发送邮件的角色
NO_LIMIT_SEND_ROLE = "admin,vip"

# 禁用匿名用户创建邮箱,如果设置为 true,则用户只能在登录后创建邮箱地址
DISABLE_ANONYMOUS_USER_CREATE_EMAIL = true

# 设置系统角色 vip , user , admin
USER_ROLES = [
{ domains = ["example.com"], prefix = "", role = "vip" },
{ domains = ["example.com"], prefix = "", role = "user" },
{ domains = ["example.com"], prefix = "", role = "admin" }
]

# 网站私有密码, 配置后需要密码才能访问网站
# PASSWORDS = ["123", "456"]

# D1 数据库的名称和 ID 可以在 cloudflare 控制台查看
[[d1_databases]]
binding = "DB"
# D1 数据库名称
database_name = "mail_temp"
# D1 数据库 ID
database_id = "c0025c********************939d714"

# kv config 用于用户注册发送邮件验证码,如果不启用用户注册或不启用注册验证,可以不配置
[[kv_namespaces]]
binding = "KV"
id = "78b******************75647"

# 新建地址限流配置 /api/new_address
# [[unsafe.bindings]]
# name = "RATE_LIMITER"
# type = "ratelimit"
# namespace_id = "1001"
# # 10 requests per minute
# simple = { limit = 10, period = 60 }

# 绑定其他 worker 处理邮件,例如通过 auth-inbox ai 能力解析验证码或激活链接
# [[services]]
# binding = "AUTH_INBOX"
# service = "auth-inbox"

  • FRONTEND_ENV
    • 把下面的VITE_API_BASE替换成你的后端域名
1
2
3
VITE_API_BASE=https://back-end.example.com
VITE_CF_WEB_ANALY_TOKEN=
VITE_IS_TELEGRAM=false
  • FRONTEND_NAME
    • 你在cloudflare创建的前段pages项目名称(不是前端域名!!!)
  • 可选内容(我并没有选用)

4. 打开仓库的 Actions 页面,找到 Deploy Backend和 Deploy Frontend,点击 Run workflow 选择分支手动部署

5. Github Actions自动更新

  • 打开仓库的 Actions 页面,找到 Upstream Sync,点击 enable workflow 启用 workflow
  • 如果 Upstream Sync 运行失败,到仓库主页点击 Sync 手动同步即可
  • 修改 Upstream Sync 的 schedule 配置可自定义更新间隔,参考 cron 表达式

创建前端页面

image

  • 点击Workers和Pages,选择Pages,选择上传创建,文件选取刚才下载的文件

image

  • 在Pages自定义域里添加你的自定义域名

    • mail.example.com
  • 测试前端页面

配置邮件转发

  • 在cloudflare的帐户主页,点进你所持有的根域名,找到新的页面侧边栏的的电子邮件选项
    image

  • 电子邮件展开,点进电子邮件路由,切换到路由规则

  • 启用Catch-all 地址并编辑

    • 操作:发送到worker
    • 目标位置:选择你的后端项目名称
    • 这个的作用是把所有@example.com的邮箱邮件转到后端,接收到域名邮箱里
  • (额外选择)自定义地址,创建地址,这会创建单独的一个[email protected]的转发规则,如果想要把发送到[email protected]的邮件都转发到自己的其余邮箱,选择转发到电子邮件

配置发送邮件(使用resend)

  • 进入网站,注册账号(这里可以原汤化原食,直接用你刚设置好的域名邮箱注册
  • 需要在Domins里绑定你的域名 example.com,它会让你添加解析记录,按照它的要求在cloudflare域名的侧边栏DNS里添加相应种类的解析
    image
  • 创建api key,这里的api key就是你在后端项目里要填的RESEND_TOKEN
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量