Mailpit 与 MailHog:本地开发邮件测试工具对比与实战指南

一、为什么需要本地邮件测试工具

在开发注册验证、密码找回、通知推送等邮件功能时,直接使用生产 SMTP 服务器存在三个问题:一是会真实向用户发送测试邮件,造成骚扰;二是无法检查邮件内容渲染是否正确(HTML 布局、图片、链接);三是难以验证邮件头、DKIM 签名等投递细节。本地邮件测试工具通过启动一个捕获型 SMTP 服务器,接收并保存所有邮件,但不真正投递,开发者可以在 Web 界面中查看邮件内容、解析邮件头、测试附件,从而在不污染生产环境的前提下完成邮件功能开发与调试。

二、MailHog 概览

MailHog 是 Go 语言编写的开源 SMTP 测试工具,由 Ian Kent 开发(GitHub: mailhog/MailHog,MIT 协议)。它提供一个捕获型 SMTP 服务器(默认端口 1025)与一个 Web 界面(默认端口 8025),同时提供 JSON HTTP API 供程序化访问。

MailHog 核心特性

MailHog 的 API 端点包括:GET /api/v1/messages(分页列出邮件)、GET /api/v1/messages/{id}(获取单封邮件详情)、DELETE /api/v1/messages(清空收件箱)、GET /api/v1/search(搜索邮件)。

三、Mailpit 概览

Mailpit 是 MailHog 的现代化继任者,由 axllent(Axllent 团队)开发(GitHub: axllent/mailpit,MIT 协议),用 Go 语言实现,专为开发与测试场景设计。Mailpit 在 MailHog 的基础上重构了 Web 界面与 API,并增加了多项增强功能。

Mailpit 核心特性

Mailpit 的 API 设计上,GET /api/v1/message/{id} 返回的消息对象包含 IDFromToSubjectDateAttachmentsHeadersTextHTML 等字段,其中 HTML 为渲染后的内容。此外 Mailpit 还提供 /api/v1/message/{id}/attachment/{attachmentID} 用于下载附件。

四、核心对比

维度MailHogMailpit
语言GoGo
协议MITMIT
默认端口(SMTP/Web)1025 / 80251025 / 8025
存储内存(可选 MongoDB)SQLite 持久化
Web UI基础现代响应式,支持搜索/标签/附件预览
REST API/api/v1/messages 等/api/v1/messages、/api/v1/message/{id} 等
附件下载需解析 MIME内置 /attachment/ 端点
搜索基础全文搜索 + 高级过滤
维护状态维护较少(新功能停滞)活跃开发(2026 年持续更新)

结论:新项目推荐 Mailpit(活跃维护、SQLite 持久化、现代 UI);老项目或已有 MailHog 依赖可继续使用,二者 API 结构相似,迁移成本低。

五、Docker 快速部署

部署 Mailpit

docker run -d --name mailpit -p 1025:1025 -p 8025:8025 axllent/mailpit

启动后:SMTP 服务器位于 localhost:1025,Web 界面位于 http://localhost:8025

部署 MailHog

docker run -d --name mailhog -p 1025:1025 -p 8025:8025 mailhog/mailhog

六、接入应用

1. 环境变量配置(通用)

# SMTP 配置指向本地捕获服务器
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=          # Mailpit/MailHog 默认无认证
MAIL_PASSWORD=
MAIL_ENCRYPTION=null    # 不使用 TLS

2. Spring Boot 示例(application.yml)

spring:
  mail:
    host: localhost
    port: 1025
    username:
    password:
    properties:
      mail.smtp.auth: false
      mail.smtp.starttls.enable: false

3. Python (smtplib) 示例

import smtplib
from email.mime.text import MIMEText

msg = MIMEText('测试邮件正文')
msg['Subject'] = 'Hello from Mailpit'
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'

with smtplib.SMTP('localhost', 1025) as s:
    s.send_message(msg)

七、REST API 实战(自动化测试断言)

在 CI/CD 中,可以调用 Mailpit API 验证邮件是否发送成功、内容是否正确:

# 1. 列出最新邮件
curl http://localhost:8025/api/v1/messages?limit=1

# 2. 获取单封邮件详情(含 MIME 解析)
curl http://localhost:8025/api/v1/message/latest

# 3. 搜索包含关键词的邮件
curl "http://localhost:8025/api/v1/search?query=verification"

# 4. 清空收件箱
curl -X DELETE http://localhost:8025/api/v1/messages

注意:Mailpit API 的 latest 关键字可获取最新一封邮件,无需先查询 ID,适合测试断言。附件下载端点为 /api/v1/message/{id}/attachment/{attachmentID}

八、邮件头解析与调试技巧

Mailpit 与 MailHog 的 Web 界面均可查看邮件的完整原始 MIME 头,这是调试邮件认证(SPF/DKIM/DMARC)的关键:

如需在线解析邮件头,可使用 ztpop.net 的邮件头分析工具

九、常见问题

Q1:Mailpit/MailHog 会真正投递邮件吗?

不会。二者仅捕获并存储邮件,不执行任何 MX 解析或 SMTP 投递,因此不会向真实收件人发送任何内容。这是「测试工具」的核心设计。

Q2:如何持久化保存邮件?

Mailpit 默认使用 SQLite 持久化(数据目录可挂载卷);MailHog 默认内存存储,重启丢失,需配置 MongoDB 或使用 --storage mongodb://...

Q3:可以在生产环境使用吗?

不建议。这是开发/测试工具,捕获邮件不投递,且 Web 界面默认无认证(可配置)。生产环境请使用真实 MTA 或邮件服务。

Q4:与 mail-tester.com 的区别?

mail-tester.com 是面向投递质量检测的在线服务(发送邮件到随机地址后评分);Mailpit/MailHog 是本地开发调试工具,二者用途不同。邮件投递质量检测可参考 ztpop.net 的邮件 DNS 一键诊断