在现代 Web 应用中,邮件通知是一个不可或缺的功能,无论是用户注册、密码重置,还是系统报警,邮件都能提供及时的信息传递。在这篇文章中,我们将深入解析一个基于 Go 语言
smtp
协议和
Go 语言如何发送邮件?
在 Go 语言中,可以使用 net/smtp
标准库发送邮件,但它的 API 设计较为底层,使用起来相对麻烦。因此,我们借助 jordan-wright/email 库来简化邮件发送逻辑,使其更易读、更易用。
本文基于 gin-vue-admin
框架的插件封装了邮件发送工具,支持普通邮件发送、错误告警邮件、邮件测试等功能。
代码实现解析
首先,我们来看核心代码:
go
package utils
import (
"crypto/tls"
"fmt"
"net/smtp"
"strings"
"github.com/flipped-aurora/gin-vue-admin/server/plugin/email/global"
"github.com/jordan-wright/email"
)
// 发送邮件的主方法
func send(to []string, subject string, body string) error {
from := global.GlobalConfig.From
nickname := global.GlobalConfig.Nickname
secret := global.GlobalConfig.Secret
host := global.GlobalConfig.Host
port := global.GlobalConfig.Port
isSSL := global.GlobalConfig.IsSSL
auth := smtp.PlainAuth("", from, secret, host)
e := email.NewEmail()
if nickname != "" {
e.From = fmt.Sprintf("%s <%s>", nickname, from)
} else {
e.From = from
}
e.To = to
e.Subject = subject
e.HTML = []byte(body)
var err error
hostAddr := fmt.Sprintf("%s:%d", host, port)
if isSSL {
err = e.SendWithTLS(hostAddr, auth, &tls.Config{ServerName: host})
} else {
err = e.Send(hostAddr, auth)
}
return err
}
// 普通邮件发送方法
func Email(To, subject, body string) error {
to := strings.Split(To, ",")
return send(to, subject, body)
}
// 发送错误告警邮件
func ErrorToEmail(subject, body string) error {
to := strings.Split(global.GlobalConfig.To, ",")
if to[len(to)-1] == "" {
to = to[:len(to)-1]
}
return send(to, subject, body)
}
// 测试邮件发送方法
func EmailTest(subject, body string) error {
to := []string{global.GlobalConfig.To}
return send(to, subject, body)
}
如何使用?
要使用此工具发送邮件,你需要先配置 SMTP 邮件服务器信息,例如 Gmail、QQ 邮箱、企业邮箱等。
1️、 配置邮件服务信息
在 global.GlobalConfig
中,添加 SMTP 服务器的配置信息,例如:
c
GlobalConfig = struct {
From string
Nickname string
Secret string
Host string
Port int
IsSSL bool
To string
}{
From: "[email protected]",
Nickname: "Go Mailer",
Secret: "your_smtp_secret", // QQ/163/Gmail 需要使用授权码
Host: "smtp.example.com",
Port: 465,
IsSSL: true,
To: "[email protected]",
}
2️、发送邮件示例
以下是调用邮件工具发送邮件的示例:
** 发送普通邮件**
go
err := utils.Email("[email protected]", "Go 邮件测试", "<h1>Hello from Go!</h1>")
if err != nil {
fmt.Println("邮件发送失败:", err)
} else {
fmt.Println("邮件发送成功!")
}
** 发送错误告警邮件**
go
err := utils.ErrorToEmail("系统错误", "<p>检测到异常,请立即处理!</p>")
if err != nil {
fmt.Println("告警邮件发送失败:", err)
} else {
fmt.Println("告警邮件发送成功!")
}
** 发送测试邮件**
go
err := utils.EmailTest("测试邮件", "<p>这是一封测试邮件</p>")
if err != nil {
fmt.Println("测试邮件发送失败:", err)
} else {
fmt.Println("测试邮件发送成功!")
}
常见问题排查
1️、 邮件无法发送,返回身份验证失败?
检查 Secret
是否正确,某些邮箱(如 QQ 邮箱)需要使用 SMTP 授权码,而非密码。
2️、 邮件发送成功,但内容为空?
确保 body
内容正确,HTML 格式的邮件需要 <html>
标签包裹内容。
3️、Gmail/QQ 邮箱发送失败?
确保 SMTP 服务器地址正确,例如:
- • Gmail :
smtp.gmail.com
,端口465
(SSL)或587
(TLS) - • QQ 邮箱 :
smtp.qq.com
,端口465
(SSL)
总结
本篇文章介绍了如何使用 Go 语言通过 smtp
发送邮件,并提供了完整的代码实现。无论是普通邮件、错误告警邮件,还是测试邮件,这个工具都能轻松搞定!
你可以将它集成到你的 Web 应用中,实现用户通知、系统告警等功能。如果你在开发过程中遇到问题,欢迎留言交流!