效果预览
安装过程
首先要定义两个域名:
- 前端 URL:
xxxemail.pro4u.cyou
- 后端 URL:
xxxxhemail.pro4u.cyou
1. 数据库设置
- 在 Works 和 Pages 中选择 D1 数据库:
- 创建数据库,命名为
dev
。 - 进入
dev
数据库,打开 Console 标签。 - 复制 schema.sql 文件中的内容到 Console 中,并点击 Execute 按钮。
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,
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);
数据库创建完成。
2. 后台程序部署
- 在 Works 和 Pages 中创建应用程序,选择 Workers:
- 起名字为
cfmail-api
,保存并点击右下角的 完成。 - 点击界面右上角的 Edit Code。
- 在左边点击文件按钮,右键点击
works.js
,选择删除。 - 下载
works.js
文件,右键点击并选择上传,将下载的文件上传。 - 点击右上角的 部署。
接下来,来到项目的 Settings -> Variables 中,添加以下变量:
ADMIN_PASSWORDS = ["1234"]
后台管理员登录密码PASSWORDS = ["1234"]
前端用户访问密码DOMAINS = ["pro4u.cyou"]
需要配置的域名JWT_SECRET = ["xxxyyyzzz"]
一个jwt效验,随便填即可
填写时,需要注意变量名称和值的填写格式。例如:变量名填
ADMIN_PASSWORDS
即可,值填["1234"]
带括号在 KV Namespace Bindings 中添加一个 KV:
- 创建一个 KV,命名为
dev
。 - 在 Variable name 填写
KV
(大写)。 - KV Namespace 选择创建的 KV 库
dev
。在创建的Works的设置页面
添加 D1 数据库:
- 在 Settings -> Variables 中,找到 D1 Database,添加上一步创建的数据库
dev
。在Works的设置页面 - 最后进行一次部署。这一点是经常出错的地方,每次修改都要重新部署才能生效。
后端验证
后端设置完成后,通过访问后端域名及目录进行验证。例如:
xxxemail.pro4u.cyou
返回结果OK
xxxhemail.pro4u.cyou
返回结果OK
若返回上述结果,说明后端配置完成,后期可随时在变量中增删内容以达到配置效果。
3. 前台程序部署
- 在 Works 和 Pages 中创建应用程序,选择 Pages:
- 选择 Create using direct upload,然后点击 Upload assets。
- 访问 官方文档 生成配置文件。
- 在地址栏输入后端的 HTTPS 地址(如
https://xxxhemail.pro4u.cyou
),生成配置,下载frontend.zip
文件并上传到 Pages。
最后,在 Custom Domain 中为前端自定义一个域名,例如 xxxemail.pro4u.cyou
。前端验证时,访问 https://xxxemail.pro4u.cyou
,此时应该出现界面并提示输入密码。
4. 邮件路由设置
- 登录到 Cloudflare 控制面板,选择需要使用的域名。
- 左边选择 Email 菜单,在 Email Routing 中选择 Routing rules,激活 Catch-all address 并点击 Edit。
- 选择 Send to a Worker,目标选择后端的 Worker 名字。
截止到现在,登录前端 URL 已经可以使用。
5. 发送邮件设置
- 在 Resend 的Domains进行域名验证。根据提示为当前临时邮箱使用的域名添加mx、txt等记录值
- 在 API-Key 中创建一个 API,赋予全部权限,复制生成的密码。
- 在后端的 Worker 中 Settings -> Environment Variables 中添加变量:
RESEND_TOKEN = (上一步复制的密码)
截止到以上步骤,即可完整收发邮件。
6. Telegram 机器人(可选)
- 创建 Telegram 机器人(具体方法可自行搜索)。
- 拿到用于此项目的机器人 Token 和 Telegram 账户 ID。
- 在后端的 Worker 中 Settings -> Environment Variables 中添加变量:
TELEGRAM_BOT_TOKEN = 机器人 token
- 在前端管理员后台配置 Telegram账户的 ID即可。
如需在收到邮件时推送到 Telegram,可以修改后端相关代码。
其余可选变量:
[vars]
# TITLE = "Custom Title" # 自定义网站标题
PREFIX = "tmp" # 要处理的邮箱名称前缀,不需要后缀可配置为空字符串
# 如果你想要你的网站私有,取消下面的注释,并修改密码
# PASSWORDS = ["123", "456"]
# admin 控制台密码, 不配置则不允许访问控制台
# ADMIN_PASSWORDS = ["123", "456"]
# admin 联系方式,不配置则不显示,可配置任意字符串
# ADMIN_CONTACT = "xx@xx.xxx"
DOMAINS = ["xxx.xxx1" , "xxx.xxx2"] # 你的域名, 支持多个域名
JWT_SECRET = "xxx" # 用于生成 jwt 的密钥, jwt 用于给用户登录以及鉴权
BLACK_LIST = "" # 黑名单,用于过滤发件人,逗号分隔
# 是否允许用户创建邮件, 不配置则不允许
ENABLE_USER_CREATE_EMAIL = true
# 允许用户删除邮件, 不配置则不允许
ENABLE_USER_DELETE_EMAIL = true
# 允许自动回复邮件
ENABLE_AUTO_REPLY = false
# 是否启用 webhook
# ENABLE_WEBHOOK = true
# 前端界面页脚文本
# COPYRIGHT = "Dream Hunter"
# 默认发送邮件余额,如果不设置,将为 0
# DEFAULT_SEND_BALANCE = 1
# Turnstile 人机验证配置
# CF_TURNSTILE_SITE_KEY = ""
# CF_TURNSTILE_SECRET_KEY = ""
# dkim config
# DKIM_SELECTOR = "mailchannels" # 参考 DKIM 部分 mailchannels._domainkey 的 mailchannels
# DKIM_PRIVATE_KEY = "" # 参考 DKIM 部分 priv_key.txt 的内容
# telegram bot 最多绑定邮箱数量
# TG_MAX_ACCOUNTS = 5
# 全局转发地址列表,如果不配置则不启用,启用后所有邮件都会转发到列表中的地址
# FORWARD_ADDRESS_LIST = ["xxx@xxx.com"]
项目官方文档
项目 GitHub 仓库
© 版权声明
THE END