From ba6b02635b0adfbb5fa9a5039fd8af2e34fec640 Mon Sep 17 00:00:00 2001 From: eoao Date: Sun, 10 Aug 2025 11:37:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81API?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7=EF=BC=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-en.md | 105 +-------- README.md | 142 ++---------- mail-vue/.env.remote | 2 +- mail-vue/src/i18n/en.js | 7 +- mail-vue/src/i18n/zh.js | 11 +- mail-vue/src/layout/account/index.vue | 180 ++++++++------- mail-vue/src/router/index.js | 7 +- mail-vue/src/views/analysis/index.vue | 114 ++++++---- mail-vue/src/views/login/index.vue | 208 ++++++++++-------- mail-vue/src/views/setting/index.vue | 6 +- mail-vue/src/views/sys-setting/index.vue | 32 ++- mail-worker/dist/assets/index-DQO7jFFS.js | 197 ----------------- ...{index-BP2DuLPL.css => index-NqVTnf-N.css} | 2 +- mail-worker/dist/assets/index-ONNky_gH.js | 197 +++++++++++++++++ mail-worker/dist/index.html | 4 +- mail-worker/src/api/public-api.js | 18 ++ mail-worker/src/const/kv-const.js | 3 +- mail-worker/src/entity/setting.js | 3 +- mail-worker/src/hono/webs.js | 1 + mail-worker/src/i18n/en.js | 3 + mail-worker/src/i18n/i18n.js | 2 +- mail-worker/src/i18n/zh.js | 5 +- mail-worker/src/init/init.js | 5 + mail-worker/src/security/security.js | 13 +- mail-worker/src/service/account-service.js | 4 + mail-worker/src/service/login-service.js | 8 +- mail-worker/src/service/public-service.js | 195 ++++++++++++++++ mail-worker/src/service/role-service.js | 6 +- mail-worker/src/service/setting-service.js | 1 + mail-worker/src/service/user-service.js | 43 +--- .../src/service/verify-record-service.js | 12 +- mail-worker/src/utils/crypto-utils.js | 9 + mail-worker/src/utils/ip-utils.js | 9 - mail-worker/src/utils/req-utils.js | 45 ++++ mail-worker/wrangler-action.toml | 2 +- mail-worker/wrangler-dev.toml | 2 +- mail-worker/wrangler-test.toml | 2 +- mail-worker/wrangler.toml | 2 +- 38 files changed, 894 insertions(+), 713 deletions(-) delete mode 100644 mail-worker/dist/assets/index-DQO7jFFS.js rename mail-worker/dist/assets/{index-BP2DuLPL.css => index-NqVTnf-N.css} (91%) create mode 100644 mail-worker/dist/assets/index-ONNky_gH.js create mode 100644 mail-worker/src/api/public-api.js create mode 100644 mail-worker/src/service/public-service.js delete mode 100644 mail-worker/src/utils/ip-utils.js create mode 100644 mail-worker/src/utils/req-utils.js diff --git a/README-en.md b/README-en.md index 4511e84..19ed1c4 100644 --- a/README-en.md +++ b/README-en.md @@ -13,9 +13,10 @@ ## Project Showcase -[**👉 Online Demo**](https://skymail.ink) +- [Online Demo](https://skymail.ink)
+- [Deployment Guide](https://doc.skymail.ink/en/)
+- [Beginner’s Guide – UI Deployment](https://doc.skymail.ink/en/guide/via-ui.html) -[**👉 Beginner’s Guide – UI Deployment**](https://doc.skymail.ink) | ![](/doc/demo/demo1.png) | ![](/doc/demo/demo2.png) | |--------------------------|---------------------| @@ -25,6 +26,8 @@ ## Features +- **💰 Low-Cost Usage**: No server required — deploy to Cloudflare Workers to reduce costs. + - **💻 Responsive Design**: Automatically adapts to both desktop and most mobile browsers. - **📧 Email Sending**: Integrated with Resend for bulk email sending, embedded images, attachments, and status tracking. @@ -37,6 +40,8 @@ - **🔔 Email Push**: Forward received emails to Telegram bots or other email providers. +- **📡 Open API**: Supports batch user creation via API and multi-condition email queries + - **📈 Data Visualization**: Use Echarts to visualize system data, including user email growth. - **⭐ Starred Emails**: Mark important emails for quick access. @@ -67,108 +72,18 @@ - **File Storage**: [Cloudflare R2](https://developers.cloudflare.com/r2/) -## Setup Guide - -### System Requirements - -Nodejs v18.20 + - -Cloudflare account (with a bound domain) - -**Clone the project to your local machine:** -``` shell -git clone https://github.com/eoao/cloud-mail -cd cloud-mail/mail-worker -``` - -**Install Dependencies:** -```shell -npm i -``` - -**Configure the Project** - -mail-worker/wrangler.toml - -```toml -[[d1_databases]] -binding = "db" # Default binding name for D1 database, cannot be changed -database_name = "" # Database name -database_id = "" # Database ID - -[[kv_namespaces]] -binding = "kv" # Default binding name for KV storage, cannot be changed -id = "" # KV namespace ID - - -[[r2_buckets]] -binding = "r2" # Default binding name for R2 storage, cannot be changed -bucket_name = "" # R2 bucket name - -[assets] -binding = "assets" # Static asset binding name, cannot be changed -directory = "./dist" # Directory for frontend Vue project build, default: dist - -[vars] -orm_log = false -domain = [] # Configure email domains, example: ["example1.com", "example2.com"] -admin = "" # Admin email, example: "admin@example.com" -jwt_secret = "" # JWT secret for login tokens, choose a random string -``` - -**Deploy Remotely** - -1. Create KV, D1 database, and R2 object storage in Cloudflare Console. -2. In the project directory `mail-worker/wrangler.toml`, configure the environment variables and database IDs/names. -3. Run the deployment command: - - ```shell - npm run deploy - ``` - -4. In Cloudflare → Account Home → Your Domain → Email → Email Routing → Route Rules → Catch-all Address, edit and route to the worker. - -5. In your browser, visit `https://your-project-domain/api/init/your-jwt-secret` to initialize or update the D1 and KV databases. - -6. After deployment, log in to the site with the admin account to configure R2 domains, Turnstile keys, and more. - - -**Run Locally** - -1. Run locally. Databases and object storage will automatically be set up, no manual creation needed. Data is stored in the `mail-worker/.wrangler` folder. - - ```shell - npm run dev - ``` - -2. In your browser, visit `http://127.0.0.1:8787/api/init/your-jwt-secret` to initialize D1 and KV databases. - -3. For local testing, you can set the R2 domain to `http://127.0.0.1:8787/api/file`. - -**Email Sending** - -1. Register on Resend, then click on “Domains” to add and verify your domain. Wait for verification. - -2. Go to "API Keys" to create an API key, then copy the token and paste it in the project website settings. - -3. Go to "Webhooks" and add a callback URL `https://your-project-domain/api/webhooks`. - Select the following events: ✅ (email.bounced, email.complained, email.delivered, email.delivery_delayed). - - -**Project Update** - -After the update, run `https://your-project-domain/api/init/your-jwt-secret` to synchronize the database schema. ## Support - + +

**Special Sponsors** -[DartNode](https://dartnode.com):Providing cloud computing service resource support +[DartNode](https://dartnode.com):Providing cloud computing service resource support. [![Powered by DartNode](https://dartnode.com/branding/DN-Open-Source-sm.png)](https://dartnode.com "Powered by DartNode - Free VPS for Open Source") diff --git a/README.md b/README.md index 1b30c7a..df40843 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

Cloud Mail

-

使用Vue3开发的响应式简约邮箱服务,支持邮件发送附件收发,可以部署到Cloudflare云平台实现免费白嫖🎉

+

使用Vue3开发的响应式邮箱服务,支持邮件发送,无需服务器可部署到Cloudflare平台 🎉

简体中文 | English @@ -14,13 +14,13 @@ ## 项目简介 -只需要一个域名,就可以创建多个不同的邮箱,类似各大邮箱平台 QQ邮箱,谷歌邮箱等,本项目使用Cloud flare部署,Resend推送邮件,无需服务器费用,搭建属于自己的邮箱服务 +只需要一个域名,就可以创建多个不同的邮箱,类似各大邮箱平台 QQ邮箱,谷歌邮箱等,本项目使用Cloudflare部署,Resend推送邮件,无需服务器费用,搭建自己的邮箱服务 -## 项目展示 +## 项目展示 -[**👉 在线演示**](https://skymail.ink) - -[**👉 小白保姆教程-界面部署**](https://doc.skymail.ink) +- [在线演示](https://skymail.ink)
+- [部署文档](https://doc.skymail.ink)
+- [小白保姆教程-界面部署](https://doc.skymail.ink/guide/via-ui.html) | ![](/doc/demo/demo1.png) | ![](/doc/demo/demo2.png) | |--------------------------|---------------------| @@ -33,31 +33,33 @@ ## 功能介绍 -- **💰免费白嫖**:无需服务器,部署到Cloudflare Workers 免费使用,不要钱 +- **💰 低成本使用**:无需服务器,部署到 Cloudflare Workers 降低使用成本 -- **💻响应式设计**:响应式布局自动适配PC和大部分手机端浏览器 +- **💻 响应式设计**:响应式布局自动适配PC和大部分手机端浏览器 -- **📧邮件发送**:集成resend发送邮件,支持群发,内嵌图片和附件发送,发送状态查看 +- **📧 邮件发送**:集成resend发送邮件,支持群发,内嵌图片和附件发送,发送状态查看 -- **🛡️管理员功能**:可以对用户,邮件进行管理,RABC权限控制对功能及使用资源限制 +- **🛡️ 管理员功能**:可以对用户,邮件进行管理,RABC权限控制对功能及使用资源限制 -- **🔀多号模式**:开启后一个用户可以添加多个邮箱,默认一用户一邮箱,类似各大邮箱平台 +- **🔀 多号模式**:开启后一个用户可以添加多个邮箱,默认一用户一邮箱,类似各大邮箱平台 -- **📦附件收发**:支持收发附件,使用R2对象存储保存和下载文件 +- **📦 附件收发**:支持收发附件,使用R2对象存储保存和下载文件 -- **🔔邮件推送**:接收邮件后可以转发到TG机器人或其他服务商邮箱 +- **🔔 邮件推送**:接收邮件后可以转发到TG机器人或其他服务商邮箱 -- **📈数据可视化**:使用echarts对系统数据详情,用户邮件增长可视化显示 +- **📡 开放API**:支持使用API批量生成用户,多条件查询邮件 -- **⭐星标邮件**:标记重要邮件,以便快速查阅 +- **📈 数据可视化**:使用echarts对系统数据详情,用户邮件增长可视化显示 -- **🎨个性化设置**:可以自定义网站标题,登录背景,透明度 +- **⭐ 星标邮件**:标记重要邮件,以便快速查阅 -- **⚙️功能设置**:可以对注册,邮件发送,添加等功能关闭和开启,设为私人站点 +- **🎨 个性化设置**:可以自定义网站标题,登录背景,透明度 -- **🤖人机验证**:集成Turnstile人机验证,防止人机批量注册 +- **⚙️ 功能设置**:可以对注册,邮件发送,添加等功能关闭和开启,设为私人站点 -- **📜更多功能**:正在开发中... +- **🤖 人机验证**:集成Turnstile人机验证,防止人机批量注册 + +- **📜 更多功能**:正在开发中... @@ -80,110 +82,10 @@ - **文件存储**:[Cloudflare R2](https://developers.cloudflare.com/r2/) - - - -## 使用教程 - -### 环境要求 - -Nodejs v18.20 + - -Cloudflare 账号 (需要绑定域名) - - -**克隆项目到本地** -``` shell -git clone https://github.com/eoao/cloud-mail #拉取代码 -cd cloud-mail/mail-worker #进入worker目录 -``` - -**安装依赖** -```shell -npm i -``` - -**项目配置** - -mail-worker/wrangler.toml - -```toml -[[d1_databases]] -binding = "db" #d1数据库绑定名默认不可修改 -database_name = "" #d1数据库名字 -database_id = "" #d1数据库id - -[[kv_namespaces]] -binding = "kv" #kv绑定名默认不可修改 -id = "" #kv数据库id - - -[[r2_buckets]] -binding = "r2" #r2对象存储绑定名默认不可修改 -bucket_name = "" #r2对象存储桶的名字 - - -[assets] -binding = "assets" #静态资源绑定名默认不可修改 -directory = "./dist" #前端vue项目打包的静态资源存放位置,默认dist - -[vars] -orm_log = false -domain = [] #邮件域名可以配置多个示例: ["example1.com","example2.com"] -admin = "" #管理员的邮箱 示例: "admin@example.com" -jwt_secret = "" #登录身份令牌的密钥,随便填一串字符串 - -``` - - - -**远程部署** - -1. 在 Cloudflare 控制台创建KV,D1数据库,R2对象存储 -2. 在项目目录 `mail-worker/wrangler.toml` 配置文件中配置对应环境变量,以及创建的数据库id和名称 -3. 执行远程部署命令 - - ```shell - npm run deploy - ``` - -4. 在Cloudflare→账户主页→你的域名→电子邮件→电子邮件路由→路由规则→Catch-all地址,编辑发送到worker - -5. 浏览器输入 `https://你的项目域名/api/init/你的jwt_secret` 初始化或更新 d1和kv数据库 - -6. 部署完成登录网站,使用管理员账号可以在设置页面添加配置 R2域名 Turnstile密钥 等 - - -[👉 使用 Github Action 部署](/doc/github-action.md) - -**本地运行** - -1. 本地运行,数据库,对象存储会自动安装,无需创建,数据库数据保存在 `mail-worker/.wrangler` 文件夹 - - ```shell - npm run dev - ``` -2. 浏览器输入 `http://127.0.0.1:8787/api/init/你的jwt_secret` 初始化d1和kv数据库 - -3. 本地运行项目设置页面r2域名可设置为 `http://127.0.0.1:8787/api/file` - -**邮件发送** - -1. 在 resend 官网注册后,点击左侧 Domains 添加并验证你的域名,等待验证完成 -2. 点击左侧 Api Keys 创建立api key, 复制token回到项目网站设置页面添加 resend token - -3. 点击左侧 Webhooks 添加回调地址 `https://你的项目域名/api/webhooks` - - 勾选✅ (email.bounced email.complained email.delivered email.delivery_delayed) - -**项目更新** - -更新后需要执行 `https://你的项目域名/api/init/你的jwt_secret` 来同步数据库结构 - ## 赞助 - +

diff --git a/mail-vue/.env.remote b/mail-vue/.env.remote index e9281f8..3375d5b 100644 --- a/mail-vue/.env.remote +++ b/mail-vue/.env.remote @@ -1,3 +1,3 @@ NODE_ENV = 'remote' VITE_APP_TITLE = '远程环境' -VITE_BASE_URL = 'https://mornglow.top/api' \ No newline at end of file +VITE_BASE_URL = '' diff --git a/mail-vue/src/i18n/en.js b/mail-vue/src/i18n/en.js index 483b74b..c87168e 100644 --- a/mail-vue/src/i18n/en.js +++ b/mail-vue/src/i18n/en.js @@ -133,6 +133,7 @@ const en = { loginSwitch: 'Sign in', websiteSetting: 'Website', websiteReg: 'Sign Up', + loginDomain: 'Sign-In Box Domain', multipleEmail: 'Multiple Accounts', multipleEmailDesc: 'Enable this feature to allow users to add multiple accounts.', physicallyWipeData: 'Physically Wipe Data', @@ -262,7 +263,7 @@ const en = { rulesVerifyTitle: 'Trigger After {count} Daily Uses per IP', botVerifyMsg: 'Please verify that you are human', noticeTitle: 'Notice', - noticePopup: 'Sign-in Popup', + noticePopup: 'Sign-In Popup', icon: 'Icon', position: 'Position', offset: 'Offset', @@ -278,7 +279,9 @@ const en = { popUp: 'Pop Up', noRecipientTitle: 'No Recipient', noRecipientDesc: 'Emails can be received even without a registered email address.', - preview: 'Preview' + preview: 'Preview', + help: 'Help', + document: 'Document' } export default en diff --git a/mail-vue/src/i18n/zh.js b/mail-vue/src/i18n/zh.js index 039aee4..2906c30 100644 --- a/mail-vue/src/i18n/zh.js +++ b/mail-vue/src/i18n/zh.js @@ -18,7 +18,7 @@ const zh = { deleteUserBtn: '删除账户', changePassword: '修改密码', newPassword: '新的密码', - confirmPassword: '旧的密码', + confirmPassword: '确认密码', add: '添加', manage: '管理', rename: '改名', @@ -133,6 +133,7 @@ const zh = { loginSwitch: '去登录', websiteSetting: '网站设置', websiteReg: '用户注册', + loginDomain: '登录框域名', multipleEmail: '多号模式', multipleEmailDesc: '开启后账号栏出现一个用户可以添加多个邮箱', physicallyWipeData: '物理清空数据', @@ -246,7 +247,7 @@ const zh = { totalUserAccount: '{msg} 个', sendBanned: '已禁用', wrote: '来信', - support: '赞助', + support: '捐助', supportDesc: '请我喝杯奶茶', featDesc: '功能说明', emailInterception: '邮件拦截', @@ -278,7 +279,9 @@ const zh = { popUp: '弹出', noRecipientTitle: '无人收件', noRecipientDesc: '即使没有注册的邮箱也能收到邮件', - preview: '预览' + preview: '预览', + help: '帮助', + document: '项目文档' } -export default zh \ No newline at end of file +export default zh diff --git a/mail-vue/src/layout/account/index.vue b/mail-vue/src/layout/account/index.vue index 2bb291f..a9d624a 100644 --- a/mail-vue/src/layout/account/index.vue +++ b/mail-vue/src/layout/account/index.vue @@ -1,28 +1,33 @@