golang电子邮件和SMTP测试工具插件库MailHog的使用

Golang电子邮件和SMTP测试工具插件库MailHog的使用

概述

MailHog是一个用于开发者的电子邮件测试工具:

  • 配置您的应用程序使用MailHog进行SMTP投递
  • 在Web界面中查看消息,或通过JSON API检索它们
  • 可选地将消息释放到真实的SMTP服务器进行投递

安装

MacOS安装

brew update && brew install mailhog

然后,在命令行中运行mailhog启动MailHog。

Debian/Ubuntu (Go < v1.18)

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

Go >= v1.17 (Debian Bookworm)

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

然后,在命令行中运行/path/to/MailHog启动MailHog。例如,在Ubuntu上Go的bin文件路径是~/go/bin/,所以可以这样启动:

~/go/bin/MailHog

FreeBSD安装

pkg install mailhog
sysrc mailhog_enable="YES"
service mailhog start

Docker安装

可以从Docker Hub运行MailHog,或使用提供的Dockerfile。

配置

查看如何配置MailHog,或使用默认设置:

  • SMTP服务器在端口1025上启动
  • HTTP服务器在端口8025上启动
  • 内存中的消息存储

功能特点

  • 实现RFC5321的ESMTP服务器
  • 支持SMTP AUTH (RFC4954)和PIPELINING (RFC2920)
  • 查看消息的Web界面(纯文本、HTML或源代码)
  • 使用EventSource实现实时更新
  • 将消息释放到真实的SMTP服务器
  • 用于故障测试的Chaos Monkey
  • 通过HTTP API列出、检索和删除消息
  • MailHog UI和API的HTTP基本认证
  • 多部分MIME支持
  • 下载单个MIME部分
  • 内存中的消息存储
  • 基于MongoDB和文件的消息持久化存储
  • 轻量级和可移植
  • 无需安装

sendmail

mhsendmail是MailHog的sendmail替代品。它使用SMTP将邮件重定向到MailHog。

您也可以使用MailHog sendmail ...代替单独的mhsendmail二进制文件。

或者,您可以通过提供-S来使用本地的sendmail命令,例如:

/usr/sbin/sendmail -S mail:1025

例如,在PHP中,您可以将以下任一行添加到php.ini中:

sendmail_path = /usr/local/bin/mhsendmail
sendmail_path = /usr/sbin/sendmail -S mail:1025

Web界面

MailHog web interface

Golang使用示例

以下是一个使用Golang通过MailHog发送测试邮件的完整示例:

package main

import (
	"fmt"
	"net/smtp"
)

func main() {
	// MailHog SMTP服务器配置
	smtpHost := "localhost"
	smtpPort := "1025"
	from := "from@example.com"
	to := []string{"to@example.com"}
	message := []byte("Subject: MailHog Test\r\n\r\nThis is a test email sent via MailHog.")

	// 连接到MailHog SMTP服务器
	// 注意:MailHog不需要认证,所以用户名和密码可以为空
	auth := smtp.PlainAuth("", "", "", smtpHost)
	
	// 发送邮件
	err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, message)
	if err != nil {
		fmt.Println("Error sending email:", err)
		return
	}
	
	fmt.Println("Email sent successfully!")
}

贡献

MailHog是MailHog的重写版本,源自M3MTA。

克隆此仓库到$GOPATH/src/github.com/mailhog/MailHog并输入make deps

需要Go 1.4+来构建。

使用make testgoconvey运行测试。

如果您做了任何更改,在提交pull请求之前运行go fmt ./...

许可证

版权所有 ©‎ 2014 - 2017, Ian Kent

根据MIT许可证发布,详情请参阅LICENSE。


更多关于golang电子邮件和SMTP测试工具插件库MailHog的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang电子邮件和SMTP测试工具插件库MailHog的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用MailHog进行Golang电子邮件和SMTP测试

MailHog是一个开源的电子邮件测试工具,专门为开发人员设计,它可以捕获发送到它的所有邮件,而无需实际发送出去。这对于开发和测试环境中的电子邮件功能验证非常有用。

MailHog简介

MailHog的主要特点:

  • 轻量级的SMTP服务器
  • 提供Web界面查看捕获的邮件
  • 支持API访问
  • 易于安装和使用

安装MailHog

1. 直接下载二进制文件

官方GitHub仓库下载适合您系统的二进制文件。

2. 使用Docker运行

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

3. 使用Homebrew (macOS)

brew install mailhog
brew services start mailhog

在Golang中使用MailHog测试邮件发送

以下是一个完整的示例,展示如何在Golang中发送邮件并通过MailHog进行测试:

package main

import (
	"fmt"
	"net/smtp"
	"strings"
)

// Mail 邮件结构体
type Mail struct {
	Sender  string
	To      []string
	Subject string
	Body    string
}

// SendMail 发送邮件
func SendMail(host string, port int, username, password string, mail Mail) error {
	addr := fmt.Sprintf("%s:%d", host, port)
	auth := smtp.PlainAuth("", username, password, host)

	msg := buildMessage(mail)
	return smtp.SendMail(addr, auth, mail.Sender, mail.To, []byte(msg))
}

func buildMessage(mail Mail) string {
	msg := "MIME-version: 1.0;\nContent-Type: text/html; charset=\"UTF-8\";\r\n"
	msg += fmt.Sprintf("From: %s\r\n", mail.Sender)
	msg += fmt.Sprintf("To: %s\r\n", strings.Join(mail.To, ";"))
	msg += fmt.Sprintf("Subject: %s\r\n", mail.Subject)
	msg += fmt.Sprintf("\r\n%s\r\n", mail.Body)

	return msg
}

func main() {
	// MailHog配置
	host := "localhost"
	port := 1025 // MailHog默认SMTP端口
	username := "" // MailHog不需要认证
	password := "" // MailHog不需要认证

	// 创建邮件
	mail := Mail{
		Sender:  "sender@example.com",
		To:      []string{"recipient@example.com"},
		Subject: "Test Email from Go",
		Body:    "<h1>Hello from Go!</h1><p>This is a test email sent using MailHog.</p>",
	}

	// 发送邮件
	err := SendMail(host, port, username, password, mail)
	if err != nil {
		fmt.Println("Error sending email:", err)
		return
	}

	fmt.Println("Email sent successfully!")
}

查看捕获的邮件

发送邮件后,您可以通过以下方式查看捕获的邮件:

  1. 打开浏览器访问 http://localhost:8025
  2. 您将看到MailHog的Web界面,显示所有捕获的邮件
  3. 点击邮件可以查看详细内容,包括头部信息和正文

高级用法

1. 使用API获取邮件

MailHog提供了REST API,您可以通过编程方式访问捕获的邮件:

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

type MailHogMessage struct {
	ID      string `json:"ID"`
	From    string `json:"From"`
	To      []string `json:"To"`
	Content struct {
		Headers map[string][]string `json:"Headers"`
		Body    string              `json:"Body"`
	} `json:"Content"`
}

func main() {
	resp, err := http.Get("http://localhost:8025/api/v2/messages")
	if err != nil {
		fmt.Println("Error fetching messages:", err)
		return
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error reading response:", err)
		return
	}

	var messages struct {
		Total int               `json:"total"`
		Items []MailHogMessage `json:"items"`
	}

	err = json.Unmarshal(body, &messages)
	if err != nil {
		fmt.Println("Error unmarshaling JSON:", err)
		return
	}

	fmt.Printf("Found %d messages\n", messages.Total)
	for i, msg := range messages.Items {
		fmt.Printf("\nMessage %d:\n", i+1)
		fmt.Printf("From: %s\n", msg.From)
		fmt.Printf("To: %v\n", msg.To)
		fmt.Printf("Subject: %s\n", msg.Content.Headers["Subject"][0])
		fmt.Println("Body preview:", msg.Content.Body[:50], "...")
	}
}

2. 集成测试示例

package main

import (
	"net/smtp"
	"testing"
)

func TestEmailSending(t *testing.T) {
	host := "localhost"
	port := 1025

	mail := Mail{
		Sender:  "test@example.com",
		To:      []string{"test-recipient@example.com"},
		Subject: "Test Email",
		Body:    "This is a test email body",
	}

	err := SendMail(host, port, "", "", mail)
	if err != nil {
		t.Errorf("Failed to send email: %v", err)
	}

	// 这里可以添加API检查,确认邮件确实被MailHog捕获
}

注意事项

  1. MailHog仅适用于开发和测试环境,不要在生产环境中使用
  2. 默认情况下,MailHog不需要任何认证
  3. MailHog不会持久化存储邮件,重启服务后所有邮件会丢失
  4. 对于更复杂的测试场景,可以考虑使用MailHog的API进行自动化验证

通过使用MailHog,您可以轻松测试Golang应用程序中的电子邮件功能,而无需担心实际发送邮件或配置复杂的SMTP服务器。

回到顶部