Files
moemail/README.md

346 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<p align="center">
<img src="public/icons/icon-192x192.png" alt="MoeMail Logo" width="100" height="100">
<h1 align="center">MoeMail</h1>
</p>
<p align="center">
一个基于 NextJS + Cloudflare 技术栈构建的可爱临时邮箱服务🎉
</p>
<p align="center">
<a href="#在线演示">在线演示</a> •
<a href="#特性">特性</a> •
<a href="#技术栈">技术栈</a> •
<a href="#本地运行">本地运行</a> •
<a href="#部署">部署</a> •
<a href="#Cloudflare 邮件路由配置">Cloudflare 邮件路由配置</a> •
<a href="#Webhook 集成">Webhook 集成</a> •
<a href="#环境变量">环境变量</a> •
<a href="#Github OAuth App 配置">Github OAuth App 配置</a> •
<a href="#贡献">贡献</a> •
<a href="#许可证">许可证</a> •
<a href="#交流群">交流群</a> •
<a href="#支持">支持</a>
</p>
## 在线演示
[https://moemail.app](https://moemail.app)
![首页](https://pic.otaku.ren/20241209/AQADwsUxG9k1uVZ-.jpg "首页")
![邮箱](https://pic.otaku.ren/20241209/AQADw8UxG9k1uVZ-.jpg "邮箱")
![个人中心](https://pic.otaku.ren/20241217/AQAD9sQxG0g1EVd-.jpg "个人中心")
## 特性
- 🔒 **隐私保护**:保护您的真实邮箱地址,远离垃圾邮件和不必要的订阅
-**实时收件**:自动轮询,即时接收邮件通知
- ⏱️ **灵活有效期**:支持 1 小时、24 小时、3 天或永久有效
- 🎨 **主题切换**:支持亮色和暗色模式
- 📱 **响应式设计**:完美适配桌面和移动设备
- 🔄 **自动清理**:自动清理过期的邮箱和邮件
- 📱 **PWA 支持**:支持 PWA 安装
- 💸 **免费自部署**:基于 Cloudflare 构建, 可实现免费自部署,无需任何费用
- 🎉 **可爱的 UI**:简洁可爱萌萌哒 UI 界面
- 🔔 **Webhook 通知**:支持通过 webhook 接收新邮件通知
## 技术栈
- **框架**: [Next.js](https://nextjs.org/) (App Router)
- **平台**: [Cloudflare Pages](https://pages.cloudflare.com/)
- **数据库**: [Cloudflare D1](https://developers.cloudflare.com/d1/) (SQLite)
- **认证**: [NextAuth](https://authjs.dev/getting-started/installation?framework=Next.js) 配合 GitHub 登录
- **样式**: [Tailwind CSS](https://tailwindcss.com/)
- **UI 组件**: 基于 [Radix UI](https://www.radix-ui.com/) 的自定义组件
- **邮件处理**: [Cloudflare Email Workers](https://developers.cloudflare.com/email-routing/)
- **类型安全**: [TypeScript](https://www.typescriptlang.org/)
- **ORM**: [Drizzle ORM](https://orm.drizzle.team/)
## 本地运行
### 前置要求
- Node.js 18+
- pnpm
- Wrangler CLI
- Cloudflare 账号
### 安装
1. 克隆仓库:
```bash
git clone https://github.com/beilunyang/moemail.git
cd moemail
```
2. 安装依赖:
```bash
pnpm install
```
3. 设置 wrangler
```bash
cp wrangler.example.toml wrangler.toml
cp wrangler.email.example.toml wrangler.email.toml
cp wrangler.cleanup.example.toml wrangler.cleanup.toml
```
设置 Cloudflare D1 数据库名以及数据库 ID
4. 设置环境变量:
```bash
cp .env.example .env.local
```
设置 AUTH_GITHUB_ID, AUTH_GITHUB_SECRET, AUTH_SECRET
5. 创建本地数据库表结构
```bash
pnpm db:migrate-local
```
### 开发
1. 启动开发服务器:
```bash
pnpm dev
```
2. 测试邮件 worker
目前无法本地运行并测试,请使用 wrangler 部署邮件 worker 并测试
```bash
pnpm deploy:email
```
3. 测试清理 worker
```bash
pnpm dev:cleanup
pnpm test:cleanup
```
4. 生成 Mock 数据(邮箱以及邮件消息)
```bash
pnpm generate-test-data
```
## 部署
### 本地 Wrangler 部署
1. 设置 wrangler
```bash
cp wrangler.example.toml wrangler.toml
cp wrangler.email.example.toml wrangler.email.toml
cp wrangler.cleanup.example.toml wrangler.cleanup.toml
```
设置 Cloudflare D1 数据库名以及数据库 ID
2. 创建云端 D1 数据库表结构
```bash
pnpm db:migrate-remote
```
2. 部署主应用到 Cloudflare Pages
```bash
pnpm deploy:pages
```
3. 部署邮件 worker
```bash
pnpm deploy:email
```
4. 部署清理 worker
```bash
pnpm deploy:cleanup
```
### Github Actions 部署
本项目可使用 GitHub Actions 实现自动化部署。支持以下触发方式:
1. **自动触发**:推送新的 tag 时自动触发部署流程
2. **手动触发**:在 GitHub Actions 页面手动触发,可选择以下部署选项:
- Run database migrations执行数据库迁移
- Deploy email Worker重新部署邮件 Worker
- Deploy cleanup Worker重新部署清理 Worker
#### 部署步骤
1. 在 GitHub 仓库设置中添加以下 Secrets
- `CLOUDFLARE_API_TOKEN`: Cloudflare API 令牌
- `CLOUDFLARE_ACCOUNT_ID`: Cloudflare 账户 ID
- `DATABASE_NAME`: D1 数据库名称
- `DATABASE_ID`: D1 数据库 ID
- `NEXT_PUBLIC_EMAIL_DOMAIN`: 邮箱域名 (例如: moemail.app)
2. 选择触发方式:
**方式一:推送 tag 触发**
```bash
# 创建新的 tag
git tag v1.0.0
# 推送 tag 到远程仓库
git push origin v1.0.0
```
**方式二:手动触发**
- 进入仓库的 Actions 页面
- 选择 "Deploy" workflow
- 点击 "Run workflow"
- 选择需要执行的部署选项
- 点击 "Run workflow" 开始部署
3. GitHub Actions 会自动执行以下任务:
- 构建并部署主应用到 Cloudflare Pages
- 根据选项或文件变更执行数据库迁移
- 根据选项或文件变更部署 Email Worker
- 根据选项或文件变更部署 Cleanup Worker
4. 部署进度可以在仓库的 Actions 标签页查看
#### 注意事项
- 确保所有 Secrets 都已正确设置
- 使用 tag 触发时tag 必须以 `v` 开头例如v1.0.0
- 使用 tag 触发时,只有文件发生变更的部分会被部署
- 手动触发时,可以选择性地执行特定的部署任务
- 每次部署都会重新部署主应用
[![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/beilunyang/moemail)
### 初次部署完成后
初次通过本地 Wrangler 或者 Github Actions 部署完成后,请登录到 Cloudflare 控制台,添加 AUTH 认证 相关 SECRETS
- 登录 [Cloudflare 控制台](https://dash.cloudflare.com/) 并选择你的账户
- 选择 Workers 和 Pages
- 在 Overview 中选择刚刚部署的 Cloudflare Pages
- 在 Settings 中选择变量和机密
- 添加 AUTH_GITHUB_ID, AUTH_GITHUB_SECRET, AUTH_SECRET
## Cloudflare 邮件路由配置
在部署完成后,需要在 Cloudflare 控制台配置邮件路由,将收到的邮件转发给 Email Worker 处理。
1. 登录 [Cloudflare 控制台](https://dash.cloudflare.com/)
2. 选择您的域名
3. 点击左侧菜单的 "电子邮件" -> "电子邮件路由"
4. 如果显示 “电子邮件路由当前被禁用,没有在路由电子邮件”,请点击 "启用电子邮件路由"
![启用电子邮件路由](https://pic.otaku.ren/20241223/AQADNcQxG_K0SVd-.jpg "启用电子邮件路由")
5. 点击后,会提示你添加电子邮件路由 DNS 记录,点击 “添加记录并启用” 即可
![添加电子邮件路由 DNS 记录](https://pic.otaku.ren/20241223/AQADN8QxG_K0SVd-.jpg "添加电子邮件路由 DNS 记录")
6. 配置路由规则:
- Catch-all 地址: 启用 "Catch-all"
- 编辑 Catch-all 地址
- 操作: 选择 "发送到 Worker"
- 目标位置: 选择刚刚部署的 "email-receiver-worker"
- 保存
![配置路由规则](https://pic.otaku.ren/20241223/AQADNsQxG_K0SVd-.jpg "配置路由规则")
### 注意事项
- 确保域名的 DNS 托管在 Cloudflare
- Email Worker 必须已经部署成功
## Webhook 集成
当收到新邮件时,系统会向用户配置并且已启用的 Webhook URL 发送 POST 请求。
### 请求头
```http
Content-Type: application/json
X-Webhook-Event: new_message
```
### 请求体
```json
{
"emailId": "email-uuid",
"messageId": "message-uuid",
"fromAddress": "sender@example.com",
"subject": "邮件主题",
"content": "邮件文本内容",
"html": "邮件HTML内容",
"receivedAt": "2024-01-01T12:00:00.000Z",
"toAddress": "your-email@moemail.app"
}
```
### 配置说明
1. 点击个人头像,进入个人中心
2. 在个人中心启用 Webhook
3. 设置接收通知的 URL
4. 点击测试按钮验证配置
5. 保存配置后即可接收新邮件通知
### 测试
项目提供了一个简单的测试服务器, 可以通过如下命令运行:
```bash
pnpm webhook-test-server
```
测试服务器会在本地启动一个 HTTP 服务器,监听 3001 端口http://localhost:3001, 并打印收到的 Webhook 消息详情。
如果需要进行外网测试,可以通过 Cloudflare Tunnel 将服务暴露到外网:
```bash
pnpx cloudflared tunnel --url http://localhost:3001
```
### 注意事项
- Webhook 接口应在 10 秒内响应
- 非 2xx 响应码会触发重试
## 环境变量
本项目使用以下环境变量:
### 认证相关
- `AUTH_GITHUB_ID`: GitHub OAuth App ID
- `AUTH_GITHUB_SECRET`: GitHub OAuth App Secret
- `AUTH_SECRET`: NextAuth Secret用来加密 session请设置一个随机字符串
### 邮箱配置
- `NEXT_PUBLIC_EMAIL_DOMAIN`: 邮箱域名,支持多域名,用逗号分隔 (例如: moemail.app,bitibiti.com)
### Cloudflare 配置
- `CLOUDFLARE_API_TOKEN`: Cloudflare API Token
- `CLOUDFLARE_ACCOUNT_ID`: Cloudflare Account ID
- `DATABASE_NAME`: D1 数据库名称
- `DATABASE_ID`: D1 数据库 ID
## Github OAuth App 配置
- 登录 [Github Developer](https://github.com/settings/developers) 创建一个新的 OAuth App
- 生成一个新的 `Client ID` 和 `Client Secret`
- 设置 `Application name` 为 `<your-app-name>`
- 设置 `Homepage URL` 为 `https://<your-domain>`
- 设置 `Authorization callback URL` 为 `https://<your-domain>/api/auth/callback/github`
## 贡献
欢迎提交 Pull Request 或者 Issue来帮助改进这个项目
## 许可证
本项目采用 [MIT](LICENSE) 许可证
## 交流群
<img src="https://pic.otaku.ren/20241215/AQADXcMxGyDw-FZ-.jpg" style="width: 400px;"/>
<br />
如二维码失效请添加我的个人微信hansenones并备注 “MoeMail” 加入微信交流群
## 支持
如果你喜欢这个项目,欢迎给它一个 Star ⭐️
或者进行赞助
<br />
<br />
<img src="https://pic.otaku.ren/20240212/AQADPrgxGwoIWFZ-.jpg" style="width: 400px;"/>
<br />
<br />
<a href="https://www.buymeacoffee.com/beilunyang" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-blue.png" alt="Buy Me A Coffee" style="width: 400px;" ></a>