自搭建邮局,无限邮箱

Maildrop 邮局服务:核心架构与实现机制全解析

0. 为什么你需要 Maildrop?(引流与应用场景)

在数字隐私日益受到威胁的今天,你是否遇到过以下场景?

  • 场景一:垃圾邮件轰炸。注册一个只用一次的网站,结果主邮箱从此被推销邮件占领,每天清理垃圾邮件都要半小时。
  • 场景二:账号批量测试。作为开发者,你需要测试系统的邮件注册逻辑,但手里只有一两个真实的邮箱,根本无法模拟多用户环境。
  • 场景三:隐私信息泄露。主邮箱往往绑定了银行、支付宝等重要资产,将其暴露在安全性未知的第三方网站上,风险极大。

Maildrop 的核心使命:为你提供一个"阅后即焚"的专属邮局。你可以随时生成数以万计的临时地址,用完即弃。它是你主邮箱的"防火墙",也是开发者手中最锋利的"测试利器"。


1. 前置条件:搭建前的准备工作

在深入架构之前,请确保你已经准备好以下"基础设施",这是任何自建邮局能跑通的前提:

  1. 公网服务器:需要一台拥有公网 IP 的云服务器(建议海外,防止 25 端口被封禁)。
  2. 独享域名:你需要拥有一个域名的管理权。
  3. DNS 解析配置(关键)
    • A 记录 :将子域名(如 mail.yourdomain.com)解析到你的服务器 IP。
    • MX 记录 :这是邮局的"指路牌"。将根域名(@)的 MX 记录指向你刚才设置的 A 记录(mail.yourdomain.com),优先级建议设为 10
    • 25 端口开放 :确保服务器防火墙和云商安全组已放行 TCP 25 端口 (SMTP 接收)和 5000 端口(Web 访问)。

2. 总体设计概览

Maildrop 是一个集成了 SMTP 协议接收端Web 管理端 的闭环邮件系统。其核心逻辑在于:将网络底层的字节流邮件转化为可被现代 Web 应用处理的结构化数据,并配合精密的生命周期管理。

密码就是在配置文件里面的内容,输入密码之后进入首页。

可以在里面创建自己的邮箱,域名也是在配置文件配置。

如果不知道MX记录怎么配置可以搜索一下,或者后续接着出这个的配置。

核心流转图

外界邮件投递 -> SMTP Server (25端口) -> Parser (邮件解析) -> Storage (SQLite/JSON) -> API/Web UI (用户查看)


2. 核心组件详解

Maildrop 是一个集成了 SMTP 协议接收端Web 管理端 的闭环邮件系统。其核心逻辑在于:将网络底层的字节流邮件转化为可被现代 Web 应用处理的结构化数据,并配合精密的生命周期管理。

核心流转图

外界邮件投递 -> SMTP Server (25端口) -> Parser (邮件解析) -> Storage (SQLite/JSON) -> API/Web UI (用户查看)


2. 核心组件详解

2.1 SMTP 接收引擎 (src/backend/smtp_server.py)

这是整个邮局的"大门"。

  • 异步驱动 :采用 aiosmtpd 库,基于 Python 的 asyncio。它不像传统服务器那样为每个连接创建一个进程,而是在单个线程内高效处理成百上千的并发连接。
  • 动态拦截 (handle_DATA) :这是最核心的钩子函数。当一封邮件完全传输完毕后,系统会拿到原始的字节流(envelope.content)。在此阶段,系统会优先提取发件人 IP,进行黑白名单校验,不合格的直接返回 550 Access denied

2.2 邮件解析专家 (src/backend/email_parser.py)

原始邮件流是一堆包含 Base64、Quoted-printable 编码的混乱字符。

  • 任务:递归解析 MIME 结构。
  • 处理细节
    • 自动识别并解码非 UTF-8 编码的标题和正文。
    • 处理 Multipart/Alternative(同时包含 HTML 和纯文本)。
    • 提取附件并将其元数据化,方便 Web 端直接渲染。
  • 结果 :生成一个标准化的 JSON 对象,包含 From, To, Subject, Body, Timestamp 等字段。

2.3 存储与投递逻辑 (src/backend/inbox_handler.py)

这是邮局的"分拣中心"。

  • 收件人分拣 :根据解析出的 To 字段,匹配系统中的虚拟邮箱。
  • 多模式切换
    • V1 (JSON):将所有邮件堆在一个巨大的 JSON 文件里(仅推荐小型测试)。
    • V2 (SQLite/Database) :通过 db_inbox_handler.py 将邮件写入 SQL 数据库,实现毫秒级的检索速度。
  • 配额管理:限制每个邮箱的最大邮件数量(默认 50 封),防止恶意灌水导致磁盘溢出。

2.4 邮箱生命周期管理 (src/backend/mailbox_service.py)

这是 Maildrop 区别于普通邮局的核心:

  • 过期机制 :每个虚拟邮箱创建时都有 expires_at
  • 服务层职责
    • 负责邮箱的 CRUD(增删改查)。
    • 审计日志:记录所有管理操作。
    • 白名单策略:在投递前再次确认该邮箱是否开启了"仅限特定发件人"模式。

3. 关键业务流程分析

3.1 邮件接收流程

  1. SMTP Server 建立连接,握手。
  2. 接收 RCPT TO,校验域名是否属于本邮局。
  3. 接收 DATA 字节流。
  4. 调用 email_parser 转化为 JSON。
  5. inbox_handler 查找收件箱:
    • 检查收件箱是否存在且未过期。
    • 检查发件人是否在白名单内。
  6. 写入存储,返回 250 OK

3.2 自动清理流程

系统通过后台定时任务(或在每次请求时触发)执行以下操作:

  1. 清理邮件 :删除超过 config.EMAIL_RETENTION_TIME 的单封邮件。
  2. 清理邮箱 :删除当前时间大于 expires_at 的虚拟邮箱及其所有内容。
  3. 空间维护 :确保 data/ 目录的大小保持在 MAX_INBOX_SIZE 以内。

4. 安全防护体系

  • IP 网段白名单 :通过 ipaddress 库实现对 CIDR(如 192.168.1.0/24)的完美支持。
  • 子管理员模式 :允许通过特定的 Sub-Admin-Token 创建受限邮箱,方便集成到第三方自动化系统。
  • 双重 Auth:API 访问必须携带 Token,管理端必须携带密码。

5. 项目文件目录说明

text 复制代码
src/
├── backend/
│   ├── smtp_server.py    # SMTP 核心服务
│   ├── email_parser.py   # 邮件解码转换
│   ├── mailbox_service.py # 业务逻辑与审计
│   ├── database.py       # SQLite 封装
│   └── routes/           # API 接口定义
└── frontend/
    ├── templates/        # 页面模板
    └── static/           # UI 资源

Maildrop 是一个典型的"小而美"后端架构范本,它将复杂的邮件协议高度简化,为用户提供了一个开箱即用的隐私保护工具。

项目 GitHub 地址https://github.com/autumuhh/mail
项目 Gitee 地址
(如果觉得这个项目对你有帮助,欢迎点个 Star 支持一下!)