首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >邮件功能不敢直接发给真实用户?用MailHog搭建安全测试收件箱

邮件功能不敢直接发给真实用户?用MailHog搭建安全测试收件箱

作者头像
fruge365
发布2026-07-03 08:47:15
发布2026-07-03 08:47:15
430
举报

前言

注册验证码、密码重置、订单通知和系统告警,看起来只是应用中的一个小功能,真正调试起来却经常让人头疼。

如果直接连接真实SMTP服务器,测试邮件可能误发给用户;频繁调试还会受到账号、授权码和发送额度限制。邮件没有送达时,也很难判断问题究竟出在程序逻辑、SMTP配置,还是邮件服务商本身。只看后台日志,往往只能确认“程序尝试发送过”,却看不到最终生成的邮件到底是什么样子。

MailHog提供了一套专门面向开发和测试环境的解决方案。它会模拟一个SMTP服务器,接收应用发来的所有邮件,但不会真正投递到外部邮箱,而是把发件人、收件人、主题、正文、附件和原始邮件头完整展示在网页中。开发人员可以反复测试,而不必担心影响真实用户。

本文将介绍MailHog在Windows、Linux、macOS和Docker环境中的部署方式,并通过Python、Telnet和swaks发送测试邮件,验证从应用发信到网页收件箱展示的完整流程。最后再借助cpolar为MailHog Web界面建立公网入口,方便远程团队成员共同检查邮件模板和发送结果。

这套方案适合本地开发、功能联调、演示环境和自动化测试。MailHog负责隔离真实邮件系统,cpolar负责延伸查看入口,两者配合后,邮件调试就不再需要边测试边担心误发。

image-20260423165315303
image-20260423165315303

1.什么是MailHog?

核心功能

模拟SMTP服务器

  • MailHog启动后会监听一个SMTP端口(默认1025),你的应用可以像连接真实邮件服务器一样连接它,调用标准SMTP协议发信。

Web界面实时查看邮件

  • 所有“发送”的邮件都会被MailHog捕获,并展示在一个简洁的Web界面中(默认端口8025),包括:发件人、收件人、主题、邮件正文(HTML / 纯文本)、附件、原始邮件头(Headers)

无需配置、零依赖

  • 开箱即用,不需要账号、密码、API Key或外部服务,完全离线运行。

支持多种部署方式

  • 可通过Docker、二进制文件、Homebrew(macOS)等方式一键启动。

典型使用场景

  • 开发阶段:测试用户注册、找回密码、通知邮件等功能
  • CI/CD流水线:在自动化测试中验证邮件内容是否正确
  • 演示环境:向客户展示邮件功能,但不实际发送
  • 安全合规:避免因测试误发邮件到真实用户邮箱
  • 注意:MailHog不是生产级邮件服务器!它仅用于开发和测试,不能替代 SendGrid、Postfix、Amazon SES等真实邮件服务。

安全与隐私

  • 所有邮件仅存储在本地内存中(默认),重启即清空
  • 不连接外网,无数据泄露风险
  • 支持TLS/认证(可选),但通常开发环境无需开启

开源信息

  • GitHub:https://github.com/mailhog/MailHog
  • License:MIT(免费商用)
  • 语言:Go编写,跨平台支持(Windows/macOS/Linux/ARM)

MailHog = 本地SMTP服务器 + 邮件收件箱Web UI,专为开发者打造的“邮件沙盒”。

2.前提条件

2.1ssh远程连接到极空间
  • 开启【SSH 服务】
  • 使用终端(Windows PowerShell / Mac Terminal)登录:
代码语言:javascript
复制
ssh root@IP
957c00e3b3f0ce8aa95df96aa41b8715
957c00e3b3f0ce8aa95df96aa41b8715
2.2验证docker是否开启

使用命令:

代码语言:javascript
复制
docker -v 
systemctl status -v
image-20251017103712618
image-20251017103712618

3.在各种平台上部署MailHog

3.1 Windows部署MailHog

首先,前往GitHub上的MailHog 发布页面,下载适用于Windows的最新稳定版本。下载MailHog 后,可以原样运行,无需任何外部依赖。

image-20260423163056964
image-20260423163056964

由于Windows版MailHog是一个简单的自可执行程序,因此只需运行下载的 .exe 文件即可。下面是MailHog在Windows 10上的外观。

image-20260423163203376
image-20260423163203376

现在,您可以在 浏览器中访问localhost:8025127.0.0.1:8025,查看MailHog网页。

image-20260423163245117
image-20260423163245117
3.2 Linux部署MailHog

以下是Linux部署MailHog的方法:

代码语言:javascript
复制
sudo apt-get -y install golang-go
sudo apt-get install git
go install github.com/mailhog/MailHog

接下来,你可以在终端中直接运行MailHog可执行文件来启动服务。具体路径取决于你的系统和Go环境配置。

例如,在Ubuntu系统中,如果你使用的是默认的Go工作区设置,编译后的可执行文件通常位于 ~/go/bin/ 目录下。你可以通过以下命令启动MailHog:

代码语言:javascript
复制
~/go/bin/MailHog

现在,您可以在 浏览器中访问ip:8025,查看MailHog网页。

3.3 MacOS部署MailHog

苹果用户可以打开终端并运行以下命令:

代码语言:javascript
复制
brew install mailhog

这将在macOS上安装MailHog。接下来,你可以用以下命令启动:

代码语言:javascript
复制
mailhog

如果你想让MailHog在登录时自动启动并作为后台服务运行,可以运行以下命令:

代码语言:javascript
复制
brew services start mailhog

现在,您可以在 浏览器中访问localhost:8025127.0.0.1:8025,查看MailHog网页。

3.4 Docker部署MailHog

请确保您的计算机上安装了Docker。然后,运行以下命令即可直接从Docker Hub启动MailHog:

代码语言:javascript
复制
docker run -d -p 1025:1025 -p 7066:8025 mailhog/mailhog
image-20260423163827659
image-20260423163827659

现在,您可以在 浏览器中访问ip:7066,查看MailHog网页。

8adc8d44cfe264a694232189697fba06
8adc8d44cfe264a694232189697fba06
3.5 Docker Compose部署MailHog

创建并编辑 docker-compose.yml文件:

代码语言:javascript
复制
version: "3"
services:
mailhog:
image: mailhog/mailhog:latest
restart: always
ports:
- 1025:1025
- 8025:8025

启动容器:

代码语言:javascript
复制
docker-compose up -d

现在,您可以在 浏览器中访问ip:7066,查看MailHog网页。

4.使用MailHog测试本地电子邮件

4.1 用Python发SMTP
代码语言:javascript
复制
python3 -c "
import smtplib
s = smtplib.SMTP('192.168.50.213', 1025)
s.sendmail('a@test.com', 'b@mailhog.local', 'Subject: Test\n\nHi')
s.quit()
"
image-20260423165024670
image-20260423165024670

您可以访问MailHog Web UI来验证电子邮件是否成功发送。

fc36d90722a9eb766981622ecdb1cdb6
fc36d90722a9eb766981622ecdb1cdb6
4.2 使用telnet手动发邮件
代码语言:javascript
复制
telnet 192.168.50.213 1025

然后输入以下内容(每行回车):

代码语言:javascript
复制
EHLO localhost
MAIL FROM:<kinsta@mailhog.local>
RCPT TO:<test@mailhog.local>
DATA
From: Salman <kinsta@mailhog.local>
To: Test <test@mailhog.local>
Subject: Hello, MailHog!

Hey there,
Missing you pig time.
Hogs & Kisses,
Salman
.
QUIT
image-20260423164935630
image-20260423164935630

您可以访问MailHog Web UI来验证电子邮件是否成功发送。

5f97f2e210a8925a745af6e4964d75bf
5f97f2e210a8925a745af6e4964d75bf
4.3 用swaks

强大的SMTP测试工具,先安装swaks(在Debian/Ubuntu上):

代码语言:javascript
复制
apt update && apt install swaks -y

然后发送:

代码语言:javascript
复制
swaks --to test@mailhog.local \
      --from kinsta@mailhog.local \
      --server 192.168.50.213:1025 \
      --body "Hey there, Missing you pig time." \
      --header "Subject: Hello, ceshichenggong!"
image-20260423165138717
image-20260423165138717

您可以访问MailHog Web UI来验证电子邮件是否成功发送。

image-20260423165158796
image-20260423165158796
4.4 从另一个Docker容器

比如PHP/Node.js应用。

如果你正在开发一个Web应用,只需配置它的SMTP设置为:

  • Host: 192.168.50.213
  • Port: 1025
  • No TLS / No Auth

所有邮件都会被捕获到MailHog。

在本地开发中,MailHog是无数开发者调试邮件功能的“秘密武器”——它能捕获所有SMTP邮件并在Web界面中直观展示,安全又高效。然而,它的默认访问方式仅限于本机(localhost:8025),一旦你需要:

  • 从手机或其他设备查看测试邮件
  • 让远程团队成员验证邮件模板
  • 在公网回调场景中接收通知

……就会遇到一个现实问题:如何把运行在内网的MailHog安全地暴露到公网?

这时,cpolar就成了完美的解决方案。

5.安装cpolar实现随时随地开发

5.1 什么是cpolar?

cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。

5.2 部署cpolar

cpolar可以将你本地电脑中的服务(如SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

代码语言:javascript
复制
sudo curl https://get.cpolar.sh | sh
image-20250725104019896
image-20250725104019896

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

代码语言:javascript
复制
sudo systemctl status cpolar
22e5adfaf290a17fc3384bb296055259
22e5adfaf290a17fc3384bb296055259

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

8a6698b1bf26d64ba3645827fbfb1c29
8a6698b1bf26d64ba3645827fbfb1c29

6.配置公网地址

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:

  • 隧道名称:可自定义,本例使用了:mailhog,注意不要与已有的隧道名称重复
  • 协议:http
  • 本地地址:7066
  • 域名类型:随机域名
  • 地区:选择China Top
image-20260423165843622
image-20260423165843622

打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

image-20260423170144875
image-20260423170144875

访问成功。

image-20260423170231065
image-20260423170231065

7.保留固定公网地址

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

image-20250918151358733
image-20250918151358733

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我使用的是mailhog,大家可以自定义。填写备注信息,点击保留。

image-20260423170358745
image-20260423170358745

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道,点击右侧的编辑

image-20260423170412624
image-20260423170412624

修改隧道信息,将保留成功的二级子域名配置到隧道中

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区: China Top

点击更新

image-20260423170450768
image-20260423170450768

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

image-20260423170747886
image-20260423170747886

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

image-20260423170811252
image-20260423170811252

总结

完成部署后,应用只需要把SMTP地址指向MailHog的1025端口,所有测试邮件就会被集中捕获,并显示在Web界面中。开发人员可以直接检查主题、正文、HTML样式、附件和邮件头,不必再依靠日志猜测发送结果。

在本地环境中,可以通过8025端口访问MailHog页面;如果Docker映射为7066端口,则使用对应的宿主机端口打开。配置cpolar后,远程同事也能通过浏览器查看同一套测试邮件,适合前后端联调、模板验收和异地协作。

MailHog真正提高效率的地方,不只是避免误发,而是把邮件调试变得可见。代码是否调用成功、邮件内容是否完整、按钮链接是否正确、HTML布局是否异常,都可以在一次发送后立即确认。

需要注意的是,MailHog只适用于开发与测试环境,不能代替正式邮件服务器。生产系统仍然需要接入可靠的SMTP服务或邮件平台,并配置认证、加密、发信域名和投递策略。

当测试邮件与真实用户彻底隔离后,开发人员才可以放心修改和反复验证。MailHog负责接住每一封测试邮件,cpolar负责让团队随时查看,邮件功能也就从“怕发错、难排查”,变成一套可以稳定复现和验证的开发流程。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1.什么是MailHog?
  • 2.前提条件
    • 2.1ssh远程连接到极空间
    • 2.2验证docker是否开启
  • 3.在各种平台上部署MailHog
    • 3.1 Windows部署MailHog
    • 3.2 Linux部署MailHog
    • 3.3 MacOS部署MailHog
    • 3.4 Docker部署MailHog
    • 3.5 Docker Compose部署MailHog
  • 4.使用MailHog测试本地电子邮件
    • 4.1 用Python发SMTP
    • 4.2 使用telnet手动发邮件
    • 4.3 用swaks
    • 4.4 从另一个Docker容器
  • 5.安装cpolar实现随时随地开发
    • 5.1 什么是cpolar?
    • 5.2 部署cpolar
  • 6.配置公网地址
  • 7.保留固定公网地址
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档