前端:**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 公钥或者不确定怎么生成,可以告诉我,我帮你写生成步骤。