如何使用MailHog在本地测试电子邮件

如何使用MailHog在本地测试电子邮件

本地开发环境中测试电子邮件是一项挑战。要知道网站或网络应用程序的外发邮件是否真的到达了收件人的收件箱,这确实是一件麻烦事。进入 MailHog!

MailHog 是一款电子邮件测试工具,它让安装和配置本地电子邮件服务器变得超级简单。MailHog 设置了一个假的 SMTP 服务器。您可以配置自己喜欢的网络应用程序,使用 MailHog 的 SMTP 服务器发送和接收电子邮件。

例如,您可以配置本地 WordPress 网站使用 MailHog 发送电子邮件。

在本文中,您将了解 MailHog 的来龙去脉,包括其安装、配置、如何在本地测试电子邮件等!

什么是 MailHog?

MailHog Web UI

MailHog Web UI

MailHog 是一款开源电子邮件测试工具,主要面向开发人员。它能让您更高效地测试网络应用程序的电子邮件收发功能。

MailHog 采用 Go 编程语言构建,可在多种操作系统上运行,包括 Windows、Linux、FreeBSD 和 macOS。MailHog 由 Ian Kent 维护,以 MIT 许可发布,因此您可以免费将其用于个人和商业用途。

但您为什么首先需要 MailHog 呢?

为什么需要 MailHog

MailHog 解决了电子邮件测试的许多主要问题。

假设您正在本地开发环境中开发一个 WordPress 网站。如果您想测试联系表单或任何其他外发电子邮件,这将是一项艰巨的任务

通常情况下,网络应用程序的默认 SMTP 服务器会负责这项任务。在本地开发环境中,由于多种原因,它几乎总是无法正常工作。

您可以阅读我们的免费 SMTP 服务器指南,进一步了解 SMTP 服务器的工作原理。

SMTP 服务器的工作原理

SMTP 服务器的工作原理(来源:Wikimedia Commons)

首先,您需要设置操作系统、网络服务器网络应用程序,以便在本地环境中启用电子邮件。然后,你还得确保邮件能顺利到达收件人的收件箱,这可能会浪费你的时间(和收件箱空间)。

还有使用真实电子邮件地址进行测试的问题。这会损害您私人电子邮件的可信度

MailHog 解决了上述所有问题。它可以设置一个虚假的 SMTP 服务器,让你的网络应用程序发送和接收电子邮件。它甚至还能将收发的电子邮件存储在一个别致的 Web UI 中,这样你就可以像使用真正的电子邮件收件箱一样浏览它们。

最后,MaiilHog 还能让你通过 API 检索这些邮件,以便进行自动测试。这是一项强大的功能,如何使用 API 完全取决于你。

MailHog 功能

MailHog 拥有许多开箱即用的功能。以下是它的一些主要亮点:

  • 轻巧便携:您无需安装 MailHog 即可使用。这是 MailHog 的主要优势之一。这使得它具有很高的便携性,几乎可以在任何操作系统或网络服务器上运行。
  • 扩展的 SMTP 支持:MailHog 不仅支持设置假冒的 SMTP 服务器,而且您还可以使用它来设置 ESMTP 服务器(扩展 SMTP)。它还包括对 SMTP AUTH 和 PIPELINING 的支持。
  • API 支持:您可以使用 MailHog 内置的 HTTP API(或 JSON API)来检索、列出和删除电子邮件。
  • 失败测试:您可以邀请 Jim,MailHog 的 Chaos Monkey(是的,它确实叫这个名字)来测试您的网络应用程序的电子邮件送达能力。它会随机创建常见的电子邮件送达问题,如拒绝连接/身份验证和速率受限连接。
  • 实时更新:MailHog 使用 EventSource Web 界面提供即时更新。
  • 邮件捕获和存储:捕获的电子邮件可存储在内存消息存储器中,并持久保存在 MongoDB 数据库和基于文件的存储系统中。
  • 下载附件:MailHog 支持下载单个 MIME 部分。
  • Web UI:您可以使用 MailHog 的 Web UI 以纯文本、HTML 或源代码的形式查看电子邮件。它还支持多部分 MIME 和编码标题。
  • 身份验证:MailHog 的 Web UI 和 API 均支持 HTTP 基本身份验证
  • 释放捕获的邮件:您可以配置 MailHog 将捕获的邮件发布到真实的 SMTP 服务器进行交付。

Jim 是 MailHog 的 "Chaos Monkey"

Jim 是 MailHog 的 “Chaos Monkey”

除上述功能外,MailHog 目前还有两个适用于 PHP NodeJS 环境的客户端库,可轻松与 MailHog API 交互。

在各种平台上部署 MailHog

如前所述,MailHog 无需安装。不过,您仍然需要下载它,并在开发环境中进行设置。

让我们从下载 MailHog 开始。然后,我们将向您展示如何在各种平台上设置它。您可以采用多种方法进行设置。

Windows 上的 MailHog

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

MailHog GitHub 发布页面

MailHog GitHub 发布页面

注:截至撰写本文时,MailHog 1.0.1 是最新发布版本。您可以下载预编译的 Windows、Linux 和 Darwin (macOS) 平台版本。如果您使用的是小众平台,也可以下载其源代码,并根据您的具体使用情况进行编译。

由于 Windows 版 MailHog 是一个简单的自可执行程序,因此只需运行下载的 .exe 文件即可。如果出现任何安全警报,请确保允许 MailHog 在本地主机环境中运行,不受防火墙限制。

下面是 MailHog 在 Windows 10 上的外观。

MailHog 在 Windows 10 上运行

MailHog 在 Windows 10 上运行

您可以看到 SMTP 服务器的端口是 1025 ,HTTP 服务器的端口是 8025

虽然还没有什么特别之处,但可以确认 MailHog 正在您的系统上运行。

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

Windows 上的 MailHog Web UI

Windows 上的 MailHog Web UI

由于我们还没有配置任何网络应用程序来使用 MailHog,因此您在这里还找不到任何列出的电子邮件。我们将在本文稍后部分介绍这一点。

Linux 上的 MailHog

如果您使用的是 Linux (Ubuntu/Debian),以下是部署 MailHog 的方法:

sudo apt-get -y install golang-go
sudo apt-get install git
go install github.com/mailhog/MailHog

第一个 Linux 命令是在开发环境中安装 Golang 编程语言(如果还没有的话)。如果您已经安装了 Go,可以跳过这一行。下一条命令是在机器上安装 git(如果已经安装,也可以跳过这一行)。

第三条命令使用 Go 的指令从 GitHub 仓库获取 MailHog 的最新稳定版本。

接下来,你可以在终端运行 /path/to/MailHog 来启动 MailHog。具体路径可能因 Linux 版本而异。在 Ubuntu 上,Go 的 bin 文件存储在 ~/go/bin/ 目录下,你可以运行下面的代码来启动 MailHog:

~/go/bin/MailHog

差不多就是这样。MailHog 现在正在你的 Linux 机器上运行。看起来就是这样。

在 Linux (Ubuntu) 上运行 MailHog

在 Linux (Ubuntu) 上运行 MailHog

如果想在每次登录时自动启动 MailHog,可以使用 supervisord、upstart 等工具将其设置为以守护进程方式启动。您也可以使用 geerlingguy 提供的 init 脚本Ansible 角色来完成同样的操作。

和 Windows 一样,你可以看到 SMTP 服务器从 1025 端口启动,HTTP 服务器从 8025 端口启动。

在浏览器中访问 localhost:8025127.0.0.1:8025,即可看到 MailHog Web UI。

Linux (Ubuntu) 上的 MailHog Web UI

Linux (Ubuntu) 上的 MailHog Web UI

MacOS 上的 MailHog

苹果用户可以使用 Homebrew 安装 MailHog。打开终端并运行以下命令:

brew install mailhog

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

mailhog

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

brew services start mailhog

差不多就是这样。现在,MailHog 已安装在你的 macOS 上。你可以在浏览器中访问 127.0.0.1:8025localhost:8025 查看其 Web UI。

Docker 上的 MailHog

Docker 是在任何平台上安装 MailHog 的最简单方法之一。

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

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

让我们分解一下上述命令及其指令:

  •  docker run 启动一个 docker 容器
  •  -d 指令在后台运行 docker 容器。
  •  -p 1025:1025-p 8025:8025 指令将 MailHog 的默认 SMTP 端口暴露给你的本地端口。
  •  mailhog/mailhog 从 Docker Hub 获取最新的 MailHog 版本。

另外,如果你想将 MailHog 的 Maildir 挂载到本地文件系统(而不是 Docker 容器内),可以运行以下命令:

docker run -d -e "MH_STORAGE=maildir" -v $PWD/maildir:/maildir -p 1025:1025 -p 8025:8025 mailhog/mailhog

像以前一样,你可以在浏览器中访问 localhost:8025127.0.0.1:8025 来使用 MailHog Web UI。

Docker Compose 上的 MailHog

Docker Compose 是 Docker 的一个扩展,可让您通过一条命令轻松运行多个 Docker 容器。您只需在 YAML 文件中定义要运行的所有容器即可。

默认情况下,Docker Compose 要求你将该文件命名为 docker-compose.yaml

要使用 Docker Compose 运行 MailHog,你的 docker-compose.yaml 文件应该是这样的:

version: "3"
services:
mailhog:
image: mailhog/mailhog:latest
restart: always
ports:
- 1025:1025
- 8025:8025

在该文件所在文件夹中,运行以下命令在后台启动 MailHog:

docker-compose up -d mailhog

它的工作原理与 Docker 完全相同。只是在这里,你不必提及许多指令,因为你已经定义了它们。

现在,你可以在浏览器中输入 localhost:8025127.0.0.1:8025 查看 MailHog Web UI。

除上述方法外,MailHog 的 GitHub repo 还包含在 AWS Elastic Beanstalk 上部署 MailHog 的指南。

使用 mhsendmail 配置 MailHog

MailHog 使用 mhsendmail 将网络应用程序的电子邮件重定向到其 SMTP 服务器,mhsendmail 是专为 MailHog 创建的 sendmail 替代程序。它能确保你的网络应用程序使用 localhost:1025 SMTP 服务器发送和接收邮件,默认情况下,MailHog 配置为处理该服务器。

要开始使用,你需要下载并安装 mhsendmail。根据你的平台,你可以采用不同的方法。

例如,如果你使用的是 Ubuntu,可以使用以下命令从 GitHub 仓库下载 mhsendmail

wget https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64

接下来,将该文件设为可执行文件,并将其移动到用户目录下。为此,请使用以下命令:

sudo chmod +x mhsendmail_linux_amd64
sudo mv mhsendmail_linux_amd64 /usr/local/bin/mhsendmail

另外,你也可以在 Golang 或 Homebrew 上运行此命令来获取 mhsendmail

go install github.com/mailhog/mhsendmail

运行上述命令前,请确保已安装 Go。如果您使用的是 Linux,请参阅上文 “Linux 上的 MailHog” 部分。要使用 Homebrew 安装 Go,请运行以下命令:

brew install go

下载完 mhsendmail 后,现在就可以开始安装了:

go install github.com/mailhog/mhsendmail

接下来,你需要配置你的网络应用程序,使其使用 MailHog 的 mhsendmail 作为电子邮件路由服务。大多数 Linux 系统默认设置为使用 sendmail

你可以通过编辑 php.ini 文件来实现这一点。在大多数服务器上,你可以在根目录下找到 php.ini 文件。你也可以执行以下命令找到它的位置:

php -i | grep 'php.ini'

对于运行 Ubuntu 的 Linux 机器,需要将 sendmail_path 的值设置为:

sendmail_path = /usr/local/bin/mhsendmail

您也可以使用下面显示的值来代替上述值,以获得相同的结果:

sendmail_path = /usr/sbin/sendmail -S mail:1025

如果你使用 Go 来安装 mhsendmail,或者你使用的是其他 Linux 变体,路径可能会根据你的平台/配置略有不同。请确保链接到正确的 mhsendmail 目录。

Mac 用户需要编辑他们的 Postfix 配置文件,以正确设置 MailHog。你可以使用以下 Postfix 配置:

myhostname = localhost
relayhost = [127.0.0.1]:1025

对于 WordPress 网站,您可以使用免费的 MailHog for WordPress 插件将您网站的电子邮件路由到 MailHog。要使用它,请在 WordPress 管理仪表板中安装并激活该插件。

请阅读 MailHog 文档,了解如何在其他各种平台/配置上进行设置。

其他 MailHog 配置选项

您可以使用 MailHog 的各种环境变量或命令行选项来配置 MailHog。

例如,你可以使用 MH_HOSTNAME 环境变量或 -hostname 命令行选项,将默认主机名从 mailhog.example 更改为自定义名称。

更多信息,请查阅 MailHog 配置选项文档。

使用 MailHog 测试本地电子邮件

最后,让我们测试一下 MailHog 设置是否配置正确。

您可以使用以下 mhsendmail 指令,通过 Mailhog 的 CLI 发送电子邮件:

mhsendmail test@mailhog.local <<EOF
From: Salman <kinsta@mailhog.local>
To: Test <test@mailhog.local>
Subject: Hello, MailHog!
Hey there,
Missing you pig time.
Hogs & Kisses,
Salman
EOF

在上述代码中, <<EOF 指令设置了一个自定义分隔符,这样就可以在终端内交互式输入测试电子邮件的详细信息。当你再次输入分隔符时,它会执行所有输入内容。在这里,它会使用 mhsendmail 命令发送邮件。

使用 "mhsendmail" 发送测试电子邮件

使用 “mhsendmail” 发送测试电子邮件

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

测试电子邮件已成功发送

测试电子邮件已成功发送

您还可以点击测试邮件,验证其正文内容。

验证测试电子邮件的正文内容

验证测试电子邮件的正文内容

到此为止!现在我们可以断定 MailHog 已配置成功。

除上述方法外,还有其他方法可以发送测试电子邮件。例如,在 macOS 上,你可以在终端运行以下命令来发送测试邮件:

date | mail -s "Hello, MailHog!" test@mailhog.local

在 Windows 系统中,执行以下代码即可使用 PowerShell 发送电子邮件:

Send-MailMessage -To "test@mailhog.local" -From "salman@kinsta.com" -Subject "Hello, MailHog!" -SmtpServer "localhost" -Port 1025

您也可以定义一个包含所有邮件数据的 PHP 脚本,然后使用 PHP 的 mail() 函数发送测试邮件。为此,请定义如下 PHP 脚本并在终端执行:

<?php
$to = "test@mailhog.local";
$subject = "Hey, I’m Pi Hog Pi!";
$body = "Hello, MailHog!";
$headers = "From: pihogpi@kinsta.com" . "\r\n";
mail($to,$subject,$body,$headers);
?>

最后,你还可以使用 MailHog API 测试邮件是否已成功送达。如果你只在非图形用户界面环境中工作(如 Linux 终端、Windows PowerShell),MailHog API 在列出、检索和删除电子邮件方面超级方便。

小结

MailHog 让电子邮件测试变得轻而易举。它是测试网站或网络应用程序电子邮件的绝佳实用解决方案。此外,MailHog 还能在几乎所有流行平台上进行简单设置,并拥有易于使用的 Web UI。

评论留言