No description
Find a file
Derrity 4a47849b0d fix: switch from cookie to localStorage for token storage
Cookie was being lost on page navigation in Safari.
localStorage is more reliable across page navigations.
2026-01-18 01:21:24 +08:00
crates fix: rewrite migration to avoid semicolon splitting issue with PostgreSQL functions 2026-01-17 22:06:24 +08:00
migrations 🚀 初始提交: 批量邮件发送平台 2026-01-17 18:11:37 +08:00
src fix: Axum 0.7.9 API compatibility fixes 2026-01-17 21:53:16 +08:00
templates fix: switch from cookie to localStorage for token storage 2026-01-18 01:21:24 +08:00
.dockerignore 添加速率限制、邮件队列和 Docker 支持 2026-01-17 18:19:49 +08:00
.env.docker.example 添加速率限制、邮件队列和 Docker 支持 2026-01-17 18:19:49 +08:00
.env.example 🚀 初始提交: 批量邮件发送平台 2026-01-17 18:11:37 +08:00
.gitignore 🚀 初始提交: 批量邮件发送平台 2026-01-17 18:11:37 +08:00
Cargo.toml feat: enable TLS support for SQLx PostgreSQL connections 2026-01-17 21:59:37 +08:00
docker-compose.yml 添加速率限制、邮件队列和 Docker 支持 2026-01-17 18:19:49 +08:00
Dockerfile 添加速率限制、邮件队列和 Docker 支持 2026-01-17 18:19:49 +08:00
nginx.conf 添加速率限制、邮件队列和 Docker 支持 2026-01-17 18:19:49 +08:00
README.md 📝 更新 README: 数据库说明改为 PostgreSQL 2026-01-17 18:21:02 +08:00

📧 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 构建,可选)

安装步骤

  1. 克隆项目

    git clone https://github.com/yourusername/email-platform.git
    cd email-platform
    
  2. 配置环境变量

    cp .env.example .env
    # 编辑 .env 文件,设置必要的配置
    
  3. 安装并配置 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
    

    注意:数据库迁移会在应用启动时自动执行

  4. 构建前端资源 (可选,如果修改了 Tailwind)

    npm install
    npm run build:css
    
  5. 编译并运行

    # 开发模式
    cargo run
    
    # 生产模式
    cargo build --release
    ./target/release/email-platform
    
  6. 访问应用

    打开浏览器访问 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 退订页面

🔒 安全注意事项

  1. 生产环境必须修改默认密钥

    • 更改 JWT_SECRET
    • 更改 ENCRYPTION_KEY
    • 修改默认管理员密码
  2. HTTPS

    • 生产环境建议配置反向代理Nginx/Caddy并启用 HTTPS
  3. 防火墙

    • 限制只允许必要的端口访问
  4. 备份

    • 定期备份 SQLite 数据库文件

🛠️ 开发指南

架构设计

┌─────────────────────────────────────────────────────────────┐
│                     Handlers (HTTP)                          │
│   处理 HTTP 请求/响应,参数验证,调用 Service 层              │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                     Services (业务逻辑)                      │
│   实现业务规则,协调多个 Repository事务管理                 │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                   Repositories (数据访问)                    │
│   封装数据库操作,实现 Trait 定义的接口                      │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                     Database (SQLite)                        │
└─────────────────────────────────────────────────────────────┘

添加新功能

  1. crates/core/src/models/ 定义数据模型
  2. crates/core/src/traits/ 定义 trait 接口
  3. crates/db/src/repositories/ 实现数据访问
  4. src/services/ 实现业务逻辑
  5. src/handlers/ 添加 HTTP 处理器
  6. templates/ 添加前端页面

运行测试

# 运行所有测试
cargo test

# 运行特定 crate 测试
cargo test -p email-core

# 运行并显示输出
cargo test -- --nocapture

📋 待实现功能

  • 邮件附件支持
  • 定时发送任务
  • 邮件追踪(打开率、点击率)
  • 更多负载均衡策略
  • PostgreSQL 支持
  • Docker 部署支持
  • 多语言界面

📄 许可证

MIT License - 详见 LICENSE 文件

🤝 贡献

欢迎提交 Issue 和 Pull Request


⚠️ 声明: 本工具仅供合法的邮件营销用途。请遵守当地法律法规及反垃圾邮件政策。