效果预览
![图片[1]-通过cloudflare_temp_email结合cloudflare部署临时邮箱服务](https://joyb.cc/wp-content/uploads/2024/10/20241028115255416-临时邮箱-3.jpg)
![图片[2]-通过cloudflare_temp_email结合cloudflare部署临时邮箱服务](https://joyb.cc/wp-content/uploads/2024/10/20241028115744925-临时邮箱4.jpg)
安装过程
首先要定义两个域名:
- 前端 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);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);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。
![图片[3]-通过cloudflare_temp_email结合cloudflare部署临时邮箱服务](https://joyb.cc/wp-content/uploads/2024/10/20241028142022122-2024-10-28-14_20_07-Cloudflare-Pages-前端-_-临时邮箱文档.jpg)
最后,在 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"][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"][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"]