如何使用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 的方法:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo apt-get -y install golang-go
sudo apt-get install git
go install github.com/mailhog/MailHog
sudo apt-get -y install golang-go sudo apt-get install git go install github.com/mailhog/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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
~/go/bin/MailHog
~/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。開啟終端並執行以下命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
brew install mailhog
brew install mailhog
brew install mailhog

這將在 macOS 上安裝 MailHog。接下來,你可以用以下命令啟動:

mailhog

如果你想讓 MailHog 在登入時自動啟動並作為後臺服務執行,可以執行以下命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
brew services start mailhog
brew services start mailhog
brew services start mailhog

差不多就是這樣。現在,MailHog 已安裝在你的 macOS 上。你可以在瀏覽器中訪問 127.0.0.1:8025localhost:8025 檢視其 Web UI。

Docker 上的 MailHog

Docker 是在任何平臺上安裝 MailHog 的最簡單方法之一。

首先,請確保您的計算機上安裝了 Docker。然後,執行以下命令即可直接從 Docker Hub 啟動 MailHog:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog
docker run -d -p 1025:1025 -p 8025:8025 mailhog/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 容器內),可以執行以下命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
docker run -d -e "MH_STORAGE=maildir" -v $PWD/maildir:/maildir -p 1025:1025 -p 8025:8025 mailhog/mailhog
docker run -d -e "MH_STORAGE=maildir" -v $PWD/maildir:/maildir -p 1025:1025 -p 8025:8025 mailhog/mailhog
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 檔案應該是這樣的:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
version: "3"
services:
mailhog:
image: mailhog/mailhog:latest
restart: always
ports:
- 1025:1025
- 8025:8025
version: "3" services: mailhog: image: mailhog/mailhog:latest restart: always ports: - 1025:1025 - 8025:8025
version: "3"
services:
mailhog:
image: mailhog/mailhog:latest
restart: always
ports:
- 1025:1025
- 8025:8025

在該檔案所在資料夾中,執行以下命令在後臺啟動 MailHog:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
docker-compose up -d mailhog
docker-compose up -d 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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
wget https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64
wget https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64
wget https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64

接下來,將該檔案設為可執行檔案,並將其移動到使用者目錄下。為此,請使用以下命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo chmod +x mhsendmail_linux_amd64
sudo mv mhsendmail_linux_amd64 /usr/local/bin/mhsendmail
sudo chmod +x mhsendmail_linux_amd64 sudo mv mhsendmail_linux_amd64 /usr/local/bin/mhsendmail
sudo chmod +x mhsendmail_linux_amd64
sudo mv mhsendmail_linux_amd64 /usr/local/bin/mhsendmail

另外,你也可以在 Golang 或 Homebrew 上執行此命令來獲取 mhsendmail

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
go install github.com/mailhog/mhsendmail
go install github.com/mailhog/mhsendmail
go install github.com/mailhog/mhsendmail

執行上述命令前,請確保已安裝 Go。如果您使用的是 Linux,請參閱上文 “Linux 上的 MailHog” 部分。要使用 Homebrew 安裝 Go,請執行以下命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
brew install go
brew install go
brew install go

下載完 mhsendmail 後,現在就可以開始安裝了:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
go install github.com/mailhog/mhsendmail
go install github.com/mailhog/mhsendmail
go install github.com/mailhog/mhsendmail

接下來,你需要配置你的網路應用程式,使其使用 MailHog 的 mhsendmail 作為電子郵件路由服務。大多數 Linux 系統預設設定為使用 sendmail

你可以通過編輯 php.ini 檔案來實現這一點。在大多數伺服器上,你可以在根目錄下找到 php.ini 檔案。你也可以執行以下命令找到它的位置:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php -i | grep 'php.ini'
php -i | grep 'php.ini'
php -i | grep 'php.ini'

對於執行 Ubuntu 的 Linux 機器,需要將 sendmail_path 的值設定為:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sendmail_path = /usr/local/bin/mhsendmail
sendmail_path = /usr/local/bin/mhsendmail
sendmail_path = /usr/local/bin/mhsendmail

您也可以使用下面顯示的值來代替上述值,以獲得相同的結果:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sendmail_path = /usr/sbin/sendmail -S mail:1025
sendmail_path = /usr/sbin/sendmail -S mail:1025
sendmail_path = /usr/sbin/sendmail -S mail:1025

如果你使用 Go 來安裝 mhsendmail,或者你使用的是其他 Linux 變體,路徑可能會根據你的平臺/配置略有不同。請確保連結到正確的 mhsendmail 目錄。

Mac 使用者需要編輯他們的 Postfix 配置檔案,以正確設定 MailHog。你可以使用以下 Postfix 配置:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
myhostname = localhost
relayhost = [127.0.0.1]:1025
myhostname = localhost relayhost = [127.0.0.1]:1025
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 傳送電子郵件:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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 上,你可以在終端執行以下命令來傳送測試郵件:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
date | mail -s "Hello, MailHog!" test@mailhog.local
date | mail -s "Hello, MailHog!" test@mailhog.local
date | mail -s "Hello, MailHog!" test@mailhog.local

在 Windows 系統中,執行以下程式碼即可使用 PowerShell 傳送電子郵件:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Send-MailMessage -To "test@mailhog.local" -From "salman@kinsta.com" -Subject "Hello, MailHog!" -SmtpServer "localhost" -Port 1025
Send-MailMessage -To "test@mailhog.local" -From "salman@kinsta.com" -Subject "Hello, MailHog!" -SmtpServer "localhost" -Port 1025
Send-MailMessage -To "test@mailhog.local" -From "salman@kinsta.com" -Subject "Hello, MailHog!" -SmtpServer "localhost" -Port 1025

您也可以定義一個包含所有郵件資料的 PHP 指令碼,然後使用 PHP 的 mail() 函式傳送測試郵件。為此,請定義如下 PHP 指令碼並在終端執行:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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);
?>
<?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); ?>
<?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。

評論留言