No description
Cookie was being lost on page navigation in Safari. localStorage is more reliable across page navigations. |
||
|---|---|---|
| crates | ||
| migrations | ||
| src | ||
| templates | ||
| .dockerignore | ||
| .env.docker.example | ||
| .env.example | ||
| .gitignore | ||
| Cargo.toml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| nginx.conf | ||
| README.md | ||
📧 Email Platform - 批量邮件发送平台
一个基于 Rust 构建的高性能、安全的 Web 端批量邮件发送平台。
🌟 功能特性
核心功能
-
SMTP 服务器管理
- 批量添加 SMTP 服务器配置
- 自动检测 SSL (465) / STARTTLS (587) / 明文 (25) 协议
- 密码 AES-GCM 加密存储
- 支持列表、编辑、单个/批量删除
-
收件人管理
- 支持 CSV/TXT 批量导入(自动去重 + 邮箱格式验证)
- 单个添加/删除、批量删除
- 导出为 CSV
- 按用户隔离数据
-
发送引擎
- 多 SMTP 服务器负载均衡(轮询/随机)
- 可配置并发数(1~200)
- 支持 HTML + 纯文本备选
- 自动添加 List-Unsubscribe 退订头
-
邮件模板
- 直接输入 HTML 或上传 HTML 文件
- 保存为命名模板复用
-
日志与监控
- 结构化日志(tracing)
- 滚动日志文件
- Web 端实时查看最近 300 行日志
- 发送进度条 + 成功/失败/警告计数器
安全特性
- bcrypt 密码哈希
- JWT 会话认证
- AES-GCM 敏感数据加密
- 基于角色的访问控制(管理员/普通用户)
- 每用户发送速率限制
- 所有端点需认证
🏗️ 技术栈
| 组件 | 技术 |
|---|---|
| Web 框架 | Axum 0.7 |
| 运行时 | Tokio |
| 数据库 | SQLx + PostgreSQL |
| 邮件 | lettre + native-tls |
| 认证 | jsonwebtoken + bcrypt |
| 日志 | tracing + tracing-subscriber |
| 前端 | HTMX + Tailwind CSS + Alpine.js |
| 配置 | figment + dotenvy |
| 容器 | Docker + Docker Compose |
📁 项目结构
email-platform/
├── Cargo.toml # 工作空间配置
├── .env.example # 环境变量示例
├── README.md # 项目文档
│
├── crates/
│ ├── core/ # 核心类型和 trait 定义
│ │ └── src/
│ │ ├── lib.rs
│ │ ├── models/ # 数据模型
│ │ ├── traits/ # 抽象接口
│ │ └── error.rs # 错误类型
│ │
│ ├── db/ # 数据库层
│ │ └── src/
│ │ ├── lib.rs
│ │ ├── encryption.rs # AES-GCM 加密
│ │ └── repositories/ # 数据仓库实现
│ │
│ └── smtp-engine/ # SMTP 发送引擎
│ └── src/
│ ├── lib.rs
│ ├── sender.rs # 发送器实现
│ ├── pool.rs # 连接池管理
│ └── balance.rs # 负载均衡策略
│
├── src/
│ ├── main.rs # 应用入口
│ ├── config.rs # 配置管理
│ ├── app_state.rs # 应用状态
│ │
│ ├── handlers/ # HTTP 处理器
│ │ ├── mod.rs
│ │ ├── auth.rs # 认证端点
│ │ ├── smtp.rs # SMTP 管理
│ │ ├── recipients.rs # 收件人管理
│ │ ├── templates.rs # 模板管理
│ │ ├── tasks.rs # 发送任务
│ │ ├── logs.rs # 日志查看
│ │ └── unsubscribe.rs # 退订处理
│ │
│ ├── services/ # 业务逻辑层
│ │ ├── mod.rs
│ │ ├── auth_service.rs
│ │ ├── smtp_service.rs
│ │ ├── recipient_service.rs
│ │ ├── template_service.rs
│ │ ├── task_service.rs
│ │ └── send_service.rs
│ │
│ ├── middleware/ # 中间件
│ │ ├── mod.rs
│ │ ├── auth.rs # JWT 认证
│ │ └── rate_limit.rs # 速率限制
│ │
│ └── utils/ # 工具函数
│ ├── mod.rs
│ ├── validators.rs # 数据验证
│ └── csv_parser.rs # CSV 解析
│
├── migrations/ # 数据库迁移
│ └── 001_initial_schema.sql
│
├── templates/ # Askama HTML 模板
│ ├── base.html
│ ├── login.html
│ ├── dashboard.html
│ ├── smtp/
│ ├── recipients/
│ ├── templates/
│ └── tasks/
│
├── static/ # 静态资源
│ ├── css/
│ │ └── tailwind.css
│ ├── js/
│ │ ├── htmx.min.js
│ │ └── alpine.min.js
│ └── img/
│
└── logs/ # 日志目录
🚀 快速开始
方式一:Docker 部署 (推荐)
# 克隆项目
git clone https://git.viloze.com/Derrity/BatchEmailSender.git
cd BatchEmailSender
# 复制环境变量配置
cp .env.docker.example .env
# 编辑 .env 文件,修改密码等敏感信息
nano .env
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f email-platform
# 访问 http://localhost:8080
方式二:本地开发
前置要求
- Rust 1.75+ (推荐使用 rustup)
- PostgreSQL 14+
- Node.js 18+ (用于 Tailwind CSS 构建,可选)
安装步骤
-
克隆项目
git clone https://github.com/yourusername/email-platform.git cd email-platform -
配置环境变量
cp .env.example .env # 编辑 .env 文件,设置必要的配置 -
安装并配置 PostgreSQL
# macOS brew install postgresql@16 brew services start postgresql@16 # Ubuntu/Debian sudo apt install postgresql postgresql-contrib sudo systemctl start postgresql # 创建数据库和用户 sudo -u postgres psql << EOF CREATE USER email_admin WITH PASSWORD 'your_password'; CREATE DATABASE email_platform OWNER email_admin; GRANT ALL PRIVILEGES ON DATABASE email_platform TO email_admin; EOF注意:数据库迁移会在应用启动时自动执行
-
构建前端资源 (可选,如果修改了 Tailwind)
npm install npm run build:css -
编译并运行
# 开发模式 cargo run # 生产模式 cargo build --release ./target/release/email-platform -
访问应用
打开浏览器访问
http://localhost:3000默认管理员账户:
- 用户名:
admin - 密码:
admin123(首次登录后请立即修改)
- 用户名:
⚙️ 配置说明
环境变量 (.env)
# 应用配置
APP_HOST=127.0.0.1
APP_PORT=3000
APP_ENV=development
# 数据库 (PostgreSQL)
DATABASE_URL=postgres://email_admin:your_password@localhost:5432/email_platform
# JWT 配置
JWT_SECRET=your-super-secret-key-change-in-production
JWT_EXPIRATION_HOURS=24
# 加密配置 (AES-256-GCM)
ENCRYPTION_KEY=your-32-byte-encryption-key-here
# 日志配置
LOG_LEVEL=info
LOG_DIR=./logs
LOG_FILE_PREFIX=email-platform
# 邮件配置
UNSUBSCRIBE_BASE_URL=https://yourdomain.com/unsubscribe
# 限制配置
MAX_CONCURRENCY=200
DEFAULT_DAILY_LIMIT=1000
📖 API 文档
认证
所有 API 端点(除登录外)需要在 Header 中携带 JWT:
Authorization: Bearer <token>
主要端点
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/auth/login |
用户登录 |
| POST | /api/auth/logout |
用户登出 |
| GET | /api/smtp |
获取 SMTP 配置列表 |
| POST | /api/smtp |
添加 SMTP 配置 |
| POST | /api/smtp/bulk |
批量添加 SMTP |
| POST | /api/smtp/:id/test |
测试 SMTP 连接 |
| GET | /api/recipients |
获取收件人列表 |
| POST | /api/recipients/import |
批量导入收件人 |
| GET | /api/templates |
获取模板列表 |
| POST | /api/tasks |
创建发送任务 |
| POST | /api/tasks/:id/start |
启动发送任务 |
| GET | /api/logs/stream |
SSE 实时日志流 |
| GET | /unsubscribe |
退订页面 |
🔒 安全注意事项
-
生产环境必须修改默认密钥
- 更改
JWT_SECRET - 更改
ENCRYPTION_KEY - 修改默认管理员密码
- 更改
-
HTTPS
- 生产环境建议配置反向代理(Nginx/Caddy)并启用 HTTPS
-
防火墙
- 限制只允许必要的端口访问
-
备份
- 定期备份 SQLite 数据库文件
🛠️ 开发指南
架构设计
┌─────────────────────────────────────────────────────────────┐
│ Handlers (HTTP) │
│ 处理 HTTP 请求/响应,参数验证,调用 Service 层 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Services (业务逻辑) │
│ 实现业务规则,协调多个 Repository,事务管理 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Repositories (数据访问) │
│ 封装数据库操作,实现 Trait 定义的接口 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Database (SQLite) │
└─────────────────────────────────────────────────────────────┘
添加新功能
- 在
crates/core/src/models/定义数据模型 - 在
crates/core/src/traits/定义 trait 接口 - 在
crates/db/src/repositories/实现数据访问 - 在
src/services/实现业务逻辑 - 在
src/handlers/添加 HTTP 处理器 - 在
templates/添加前端页面
运行测试
# 运行所有测试
cargo test
# 运行特定 crate 测试
cargo test -p email-core
# 运行并显示输出
cargo test -- --nocapture
📋 待实现功能
- 邮件附件支持
- 定时发送任务
- 邮件追踪(打开率、点击率)
- 更多负载均衡策略
- PostgreSQL 支持
- Docker 部署支持
- 多语言界面
📄 许可证
MIT License - 详见 LICENSE 文件
🤝 贡献
欢迎提交 Issue 和 Pull Request!
⚠️ 声明: 本工具仅供合法的邮件营销用途。请遵守当地法律法规及反垃圾邮件政策。