为了增强服务的稳定性和安全性,防止滥用行为,本次提交引入了两个核心的速率限制和验证机制: 1. **连接层验证 (`onConnect`)** - **IP 速率限制**:在 `connectionValidator.js` 中实现。限制单个 IP 地址每分钟最多 20 次连接,超过限制将临时封禁 5 分钟,以防御暴力连接攻击。 - **反向 DNS (PTR) 检查**:要求所有公共网络连接必须具有有效的 PTR 记录,用于区分合法邮件服务器和僵尸网络。 2. **数据层验证 (`onData`)** - **发件人域速率限制**:在 `rateLimiter.js` 中实现。在邮件数据传输阶段,限制单个发件人域名每分钟最多发送 10 封邮件,超过限制的域名将被临时封禁 5 分钟,以防止单一来源的邮件泛滥。 **主要变更:** - 新增 `backend/connectionValidator.js`:处理连接时的 IP 速率限制和 PTR 验证。 - 新增 `backend/rateLimiter.js`:在 `onData` 阶段对发件人域名进行速率限制。 - 在 `backend/app.js` 的 `SMTPServer` 配置中集成了 `onConnect` 验证钩子。 - 在 `backend/saveEmail.js` 中调用速率限制器,并在超限时拒绝邮件。 - 更新日志模块 (`logger.js`, `db.js`),输出更清晰,并记录安全相关事件。 - 新增 `backend/SECURITY_POLICIES.md` 文档,详细说明所有安全策略和可配置参数。 |
||
|---|---|---|
| backend | ||
| certs | ||
| frontend | ||
| .gitignore | ||
| GEMINI.md | ||
| LICENSE | ||
| README.md | ||
| compose.env | ||
| compose.full.env | ||
| docker-compose.build.yml | ||
| docker-compose.full.yml | ||
| docker-compose.self.yml | ||
| docker-compose.yml | ||
| info.md | ||
| nginx.full.conf | ||
| sample.png | ||
README.md
Email Unlimit - 轻量级、可自托管的临时邮件解决方案
本项目是一个轻量级的、可自托管的临时邮件解决方案。它允许您使用自己的域名接收邮件,并通过一个简洁的网页界面来查看这些邮件。
与 Mailu 等复杂的邮件套件不同,本项目采用了一个极简的 Node.js 服务来直接接收和处理邮件,部署和维护都非常简单。
在线体验: https://mail.shenjianl.cn
技术架构
- 前端 (Frontend): 使用 Vue.js 构建的单页面应用,负责展示收到的邮件列表。
- 后端 (Backend):
- 使用 Node.js 和 Express 搭建的 API 服务器。
- 内置一个轻量级的 SMTP 服务器 (
smtp-server),用于直接接收邮件,无需外部邮件服务。 - 通过 WebSocket 实现新邮件的实时推送。
- 数据库 (Database): 使用 MySQL 存储邮件信息,确保数据的安全性和持久性。
- 部署 (Deployment): 使用 Docker Compose 统一管理后端服务、数据库和 Nginx,实现一键部署。
前置条件
在开始之前,请确保您已满足以下条件:
1. 硬件与域名
- 一台拥有公网 IP 的云服务器。
- 一个您自己的域名(建议已完成备案)。
2. 软件环境
- 服务器上已安装 Docker 和 Docker Compose。
- 本地开发环境已安装 Node.js (仅用于构建前端)。
3. 域名 DNS 配置
要让邮件能正确发送到您的服务器,您必须配置域名的 A 记录和 MX 记录。假设您的域名是 example.com,您希望用于收信的子域名是 mail.example.com。
| 类型 | 主机记录/名称 | 记录值/指向 | 备注 |
|---|---|---|---|
| A | 您的服务器公网 IP |
将 mail 子域名指向您的服务器 |
|
| MX | @ | mail.example.com |
优先级设置为 10 |
注意: DNS 记录生效可能需要几分钟到几小时。
4. 申请 SSL/TLS 证书
为了启用 HTTPS,您需要为您的域名 mail.example.com 申请 SSL 证书。您可以从 Let's Encrypt、阿里云、腾讯云等证书颁发机构免费获取。
部署步骤
本部署方案使用 Docker Compose 统一管理所有服务(Nginx, Backend, MySQL),实现一键启动,无需在宿主机上安装 Nginx 或其他依赖。
步骤 1: 获取并准备项目
将项目代码下载并解压到您的服务器,例如 /data/email-unlimit 目录。
步骤 2: 上传 SSL 证书
将您申请到的 SSL 证书文件(通常是 .pem/.crt 和 .key 文件)上传到项目的 certs 目录下 (/data/email-unlimit/certs)。
步骤 3: 构建前端静态文件 (本地环境)
- 在您的本地开发机上,进入
frontend目录,修改.env环境变量文件:VITE_APP_DOMAIN=example.com # 改为你的主域名 - 安装依赖并构建:
cd frontend npm install npm run build - 将构建生成的
dist目录(位于frontend/dist)完整上传到服务器的/data/email-unlimit/frontend目录下。
步骤 4: 修改 Nginx 配置 (服务器)
编辑项目根目录下的 nginx.full.conf 文件,仅需修改以下三项:
server_name mail.example.com; # 改为您自己的域名
ssl_certificate /etc/nginx/certs/your_certificate.pem; # 改为您自己的证书文件名
ssl_certificate_key /etc/nginx/certs/your_certificate.key; # 改为您自己的密钥文件名
注意: 配置文件中的证书路径
/etc/nginx/certs/是容器内的路径,它会映射到宿主机的/data/email-unlimit/certs目录,请确保文件名正确。
步骤 5: 启动服务 (服务器)
在服务器的项目根目录 (/data/email-unlimit) 下执行以下命令:
# -f 指定使用 docker-compose.full.yml 配置文件,-d 表示后台运行
docker compose -f docker-compose.full.yml up -d
服务启动后,您可以通过 docker compose -f docker-compose.full.yml logs -f 查看实时日志。
如何使用
- 访问您的网站: 在浏览器中打开
https://mail.example.com(替换为您的域名)。 - 发送测试邮件: 使用任何邮箱客户端,向
anything@example.com(例如test@example.com) 发送一封邮件。 - 查看邮件: 在网站首页的输入框中输入您刚刚使用的收件人地址 (
test@example.com),点击查询,即可看到收到的邮件。
许可证
本项目采用 MIT 许可证。详情请参阅 LICENSE 文件。
