mailu branch failed
This commit is contained in:
@@ -0,0 +1,349 @@
|
||||
|
||||
前端:**Vue**
|
||||
后端:**Node.js + Express**
|
||||
数据库:**MySQL**
|
||||
邮件服务:**Mailu**
|
||||
|
||||
我帮你重新整理并生成**完整且清晰**的架构图、流程图、技术栈表 + 项目结构:
|
||||
|
||||
---
|
||||
|
||||
## 🧩 **一、架构图(新版:Vue + Express)**
|
||||
|
||||
```
|
||||
┌────────────────────────────┐
|
||||
│ 用户 │
|
||||
│ ┌──────────────────────┐ │
|
||||
│ │ mail.shenjianl.cn 前端网站 │ ←─────┐
|
||||
│ │ (Vue) │ │
|
||||
│ └──────────────────────┘ │
|
||||
└────────────┬─────────────┘
|
||||
│ HTTP (REST API)
|
||||
▼
|
||||
┌────────────────────────────┐
|
||||
│ Node.js 后端 (Express) │
|
||||
│ - 生成随机邮箱地址 │
|
||||
│ - 查询收件箱 │
|
||||
│ - 邮件接收解析写数据库 │
|
||||
└────────────┬─────────────┘
|
||||
│ MySQL
|
||||
▼
|
||||
┌────────────────────────────┐
|
||||
│ MySQL │
|
||||
│ - emails 表 │
|
||||
│ - email_attachments 表 │
|
||||
└────────────┬─────────────┘
|
||||
│
|
||||
▼
|
||||
┌────────────────────────────┐
|
||||
│ 邮件服务器(Mailu) │
|
||||
│ - SMTP 接收外部邮件 │
|
||||
│ - Catch-all 所有收件人 │
|
||||
│ - 调用 Node.js 脚本入库 │
|
||||
└────────────┬─────────────┘
|
||||
│
|
||||
▼
|
||||
┌────────────────────────────┐
|
||||
│ DNS │
|
||||
│ - MX: mail.shenjianl.cn │
|
||||
│ - A: mail.shenjianl.cn → IP │
|
||||
└────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 **二、流程图:接收 & 查看流程**
|
||||
|
||||
```
|
||||
【外部发件人】
|
||||
│
|
||||
▼
|
||||
发邮件到 abc123@shenjianl.cn
|
||||
│
|
||||
▼
|
||||
DNS MX 查找 mail.shenjianl.cn
|
||||
│
|
||||
▼
|
||||
Mailu 收到邮件 (SMTP)
|
||||
│
|
||||
▼
|
||||
调用 Node.js 脚本 (saveEmail.js)
|
||||
│
|
||||
▼
|
||||
simpleParser 解析邮件内容
|
||||
│
|
||||
▼
|
||||
写入 MySQL:
|
||||
recipient, sender, subject, body, received_at
|
||||
│
|
||||
▼
|
||||
用户访问网页:
|
||||
mail.shenjianl.cn
|
||||
│
|
||||
▼
|
||||
Vue 前端请求后端 API:
|
||||
GET /api/messages?recipient=abc123@shenjianl.cn
|
||||
│
|
||||
▼
|
||||
后端查询 MySQL 返回邮件列表
|
||||
│
|
||||
▼
|
||||
前端展示收件箱
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙ **三、技术栈清单(新版)**
|
||||
|
||||
| 层级 | 功能 | 技术选型 |
|
||||
| -------- | -------------- | ----------------------------------- |
|
||||
| 域名 & DNS | MX/A 解析 | 阿里云 DNS / Cloudflare |
|
||||
| 邮件服务器 | 接收所有外部邮件 | Mailu(基于 Postfix/Dovecot) |
|
||||
| 邮件解析 | 提取收件人/正文/主题/附件 | Node.js (mailparser) |
|
||||
| 后端 API | 生成邮箱 / 查询收件箱 | Node.js + Express |
|
||||
| 数据库 | 存储邮件信息 | MySQL |
|
||||
| 前端 | 用户界面 / 展示收件箱 | Vue.js |
|
||||
| 部署 & 管理 | 容器化 / 部署 | Docker + docker-compose |
|
||||
| 安全 | HTTPS / 防滥用 | Let's Encrypt + Nginx 反代 + IP限流/黑名单 |
|
||||
|
||||
---
|
||||
|
||||
## 🛠 **四、项目结构建议(新版)**
|
||||
|
||||
```
|
||||
📦 project-root
|
||||
├── frontend/ # Vue 前端
|
||||
│ └── (组件/页面/接口)
|
||||
├── backend/ # Node.js 后端
|
||||
│ ├── app.js # Express 主程序
|
||||
│ ├── saveEmail.js # 接收邮件脚本:解析并写入数据库
|
||||
│ └── db.js # 数据库连接
|
||||
├── docker-compose.yml # Mailu + Node.js + MySQL
|
||||
├── mailu.env # Mailu 配置
|
||||
├── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
✅ **总结:**
|
||||
|
||||
* 前端:Vue 只负责界面和展示
|
||||
* 后端:Express 提供 API + 接收邮件写 MySQL
|
||||
* 邮件服务器:Mailu catch-all 接收所有地址
|
||||
* DNS:配置 MX / A 指向服务器
|
||||
|
||||
---
|
||||
|
||||
好的!
|
||||
下面我给你**直接写好**适配新版架构的:
|
||||
✅ `docker-compose.yml`(包含:Vue 前端 + Node.js Express 后端 + MySQL + Mailu 邮件服务器)
|
||||
✅ MySQL 建表 SQL
|
||||
|
||||
---
|
||||
|
||||
## ✅ **1️⃣ docker-compose.yml**
|
||||
|
||||
> ⚠️ 注:
|
||||
|
||||
* Vue 前端用 `npm run serve` 或 `npm run build` 后放 Nginx 也行,这里为了简单直接跑开发服务
|
||||
* Mailu 是官方 Docker 邮件套件,需要 `mailu.env` 配置
|
||||
* 建议生产用 HTTPS + Nginx,下面只是开发演示架构
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:8
|
||||
container_name: mail_mysql
|
||||
restart: always
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: myrootpassword
|
||||
MYSQL_DATABASE: maildb
|
||||
MYSQL_USER: mailuser
|
||||
MYSQL_PASSWORD: mailpassword
|
||||
ports:
|
||||
- "3306:3306"
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
|
||||
backend:
|
||||
build: ./backend
|
||||
container_name: mail_backend
|
||||
restart: always
|
||||
environment:
|
||||
DB_HOST: mysql
|
||||
DB_USER: mailuser
|
||||
DB_PASSWORD: mailpassword
|
||||
DB_NAME: maildb
|
||||
ports:
|
||||
- "3000:3000"
|
||||
depends_on:
|
||||
- mysql
|
||||
|
||||
frontend:
|
||||
build: ./frontend
|
||||
container_name: mail_frontend
|
||||
restart: always
|
||||
ports:
|
||||
- "8080:8080"
|
||||
depends_on:
|
||||
- backend
|
||||
|
||||
mailu:
|
||||
image: mailu/mailu:master
|
||||
container_name: mail_server
|
||||
restart: always
|
||||
env_file: mailu.env
|
||||
ports:
|
||||
- "25:25" # SMTP
|
||||
- "465:465" # SMTPS
|
||||
- "143:143" # IMAP
|
||||
- "993:993" # IMAPS
|
||||
- "8081:80" # Mailu admin web UI(可选)
|
||||
volumes:
|
||||
- mailu_data:/data
|
||||
depends_on:
|
||||
- mysql
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
mailu_data:
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📦 **2️⃣ 建表 SQL**
|
||||
|
||||
```sql
|
||||
CREATE TABLE emails (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
recipient VARCHAR(255) NOT NULL,
|
||||
sender VARCHAR(255) NOT NULL,
|
||||
subject VARCHAR(512),
|
||||
body TEXT,
|
||||
received_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
raw MEDIUMBLOB
|
||||
);
|
||||
|
||||
CREATE TABLE email_attachments (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
email_id BIGINT NOT NULL,
|
||||
filename VARCHAR(255),
|
||||
content_type VARCHAR(128),
|
||||
content LONGBLOB,
|
||||
FOREIGN KEY (email_id) REFERENCES emails(id) ON DELETE CASCADE
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📦 **3️⃣ mailu.env**(示例配置)
|
||||
|
||||
```env
|
||||
DOMAIN=shenjianl.cn
|
||||
HOSTNAMES=mail.shenjianl.cn
|
||||
SECRET_KEY=change-this-to-a-very-random-secret
|
||||
ADMIN=admin
|
||||
ADMIN_PASSWORD=adminpassword
|
||||
DB_FLAVOR=mysql
|
||||
DB_HOST=mysql
|
||||
DB_USER=mailuser
|
||||
DB_PASSWORD=mailpassword
|
||||
DB_NAME=maildb
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ **4️⃣ 项目结构(推荐)**
|
||||
|
||||
```
|
||||
📦 project-root
|
||||
├── frontend/ # Vue 前端
|
||||
│ └── (页面/组件)
|
||||
├── backend/ # Node.js Express 后端
|
||||
│ ├── app.js # 提供 API
|
||||
│ ├── saveEmail.js # 接收邮件脚本
|
||||
│ └── db.js # 数据库连接
|
||||
├── docker-compose.yml
|
||||
├── mailu.env
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
✨ **这样就完成了:**
|
||||
|
||||
* Vue 前端对接后端 API
|
||||
* 后端(Express)接收请求、存储/查询邮件
|
||||
* Mailu 负责接收 SMTP 邮件并调用脚本写数据库
|
||||
* MySQL 存储邮件数据
|
||||
|
||||
---
|
||||
|
||||
|
||||
以下是针对你域名 `shenjianl.cn` 的**简单版 SPF、DKIM、DMARC DNS TXT 记录示范**,你可以直接复制,去你买域名的DNS管理后台添加。
|
||||
|
||||
---
|
||||
|
||||
## 1. SPF 记录
|
||||
|
||||
* **类型**:TXT
|
||||
* **主机名**:`@` (代表根域名 shenjianl.cn)
|
||||
* **值(内容)**:
|
||||
|
||||
```
|
||||
v=spf1 mx ip4:你的服务器公网IP -all
|
||||
```
|
||||
|
||||
> 把 `你的服务器公网IP` 换成你实际服务器的外网IP地址。
|
||||
|
||||
---
|
||||
|
||||
## 2. DKIM 记录(示例)
|
||||
|
||||
假设你的邮件服务器给你生成了一个 selector,叫做 `default`,那么:
|
||||
|
||||
* **类型**:TXT
|
||||
* **主机名**:`default._domainkey`
|
||||
* **值(内容)**:
|
||||
|
||||
```
|
||||
v=DKIM1; k=rsa; p=这里填你的公钥内容
|
||||
```
|
||||
|
||||
> 注意:`p=` 后面是一个很长的字符串,由邮件服务器生成的公钥。
|
||||
> 你可以让 Mailu 生成 DKIM 密钥,然后复制粘贴到这里。
|
||||
|
||||
---
|
||||
|
||||
## 3. DMARC 记录
|
||||
|
||||
* **类型**:TXT
|
||||
* **主机名**:`_dmarc`
|
||||
* **值(内容)**:
|
||||
|
||||
```
|
||||
v=DMARC1; p=quarantine; rua=mailto:admin@shenjianl.cn; pct=100
|
||||
```
|
||||
|
||||
解释:
|
||||
|
||||
* `p=quarantine`:不合规邮件放到垃圾箱
|
||||
* `rua=mailto:admin@shenjianl.cn`:每隔一段时间会收到报告(你可以换成自己的邮箱)
|
||||
* `pct=100`:所有邮件都应用该规则
|
||||
|
||||
---
|
||||
|
||||
# 总结
|
||||
|
||||
| 类型 | 主机名 | 内容示例 |
|
||||
| --- | ------------------- | ---------------------------------------------------------------- |
|
||||
| TXT | @ | `v=spf1 mx ip4:你的服务器公网IP -all` |
|
||||
| TXT | default.\_domainkey | `v=DKIM1; k=rsa; p=你的公钥` |
|
||||
| TXT | \_dmarc | `v=DMARC1; p=quarantine; rua=mailto:admin@shenjianl.cn; pct=100` |
|
||||
|
||||
---
|
||||
|
||||
如果你还没有 DKIM 公钥或者不确定怎么生成,可以告诉我,我帮你写生成步骤。
|
||||
|
||||
Reference in New Issue
Block a user