
本文介绍如何在 go 中使用 smtp 客户端(如 gomail)将邮件发送至本地运行的 mailhog 实例,实现自动化邮件捕获与测试,无需真实邮件服务器。
本文介绍如何在 go 中使用 smtp 客户端(如 gomail)将邮件发送至本地运行的 mailhog 实例,实现自动化邮件捕获与测试,无需真实邮件服务器。
MailHog 是一款轻量级、专为开发和测试设计的邮件捕获工具,它模拟 SMTP 服务器并提供 Web UI 与 REST API,方便开发者验证邮件内容、头信息及发送逻辑。值得注意的是:MailHog 本身不提供认证或加密层,其 SMTP 服务默认监听 1025 端口(而非标准的 25 或 587),且不校验用户名/密码——这意味着你只需将 Go 程序配置为连接 localhost:1025 即可直接投递邮件。
推荐使用成熟、简洁的 Gomail v2 库(非过时的 v1)。以下是一个完整、可运行的示例:
package main
import (
"log"
"gopkg.in/gomail.v2"
)
func main() {
// 创建新邮件消息
m := gomail.NewMessage()
m.SetHeader("From", "test@example.com")
m.SetHeader("To", "recipient@example.com")
m.SetHeader("Subject", "Test Email via MailHog")
m.SetBody("text/plain", "Hello from Go! This email was sent programmatically to MailHog.")
// 配置 PlainDialer:指向 MailHog 的 SMTP 地址(默认 localhost:1025)
// 注意:MailHog 不需要用户名/密码,传空字符串即可;若填入任意值也不会被校验
dialer := gomail.NewPlainDialer("localhost", 1025, "", "")
// 发送邮件
if err := dialer.DialAndSend(m); err != nil {
log.Fatalf("Failed to send email to MailHog: %v", err)
}
log.Println("✅ Email successfully sent to MailHog!")
}
? 关键注意事项:
- ✅ 确保 MailHog 已启动:可通过 mailhog 命令或 Docker 运行(如 docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog);
- ✅ SMTP 地址必须为 localhost(或容器内可达地址),端口固定为 1025(除非自定义启动参数);
- ❌ 不要填写真实邮箱凭证(如 "user", "pass")——MailHog 会忽略它们,错误填写反而可能引发连接拒绝(取决于客户端行为);
- ✅ 如需发送 HTML 邮件,可追加 m.AddAlternative("text/html", "
Hello
"); - ✅ 可结合 http.Client 调用 MailHog 的 /api/v2/messages 接口获取最新邮件进行断言,实现端到端测试闭环。
通过这种方式,你能在单元测试、CI 流程或本地调试中完全隔离外部依赖,高效验证邮件逻辑——这才是现代 Go 应用集成测试的最佳实践。











