Go 语言邮件发送完全指南:轻松实现邮件通知功能

在现代 Web 应用中,邮件通知是一个不可或缺的功能,无论是用户注册、密码重置,还是系统报警,邮件都能提供及时的信息传递。在这篇文章中,我们将深入解析一个基于 Go 语言 smtp 协议和 email 库的邮件发送工具,并提供详细的代码示例,助你快速集成邮件功能!


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 应用中,实现用户通知、系统告警等功能。如果你在开发过程中遇到问题,欢迎留言交流!

相关推荐
源码方舟3 分钟前
SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
java·spring boot·后端
热河暖男4 小时前
【实战解决方案】Spring Boot+Redisson构建高并发Excel导出服务,彻底解决系统阻塞难题
spring boot·后端·excel
noravinsc8 小时前
redis是内存级缓存吗
后端·python·django
noravinsc9 小时前
django中用 InforSuite RDS 替代memcache
后端·python·django
喝醉的小喵9 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
kaixin_learn_qt_ing10 小时前
Golang
开发语言·后端·golang
炒空心菜菜11 小时前
MapReduce 实现 WordCount
java·开发语言·ide·后端·spark·eclipse·mapreduce
wowocpp13 小时前
spring boot Controller 和 RestController 的区别
java·spring boot·后端
后青春期的诗go13 小时前
基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(二)
开发语言·后端·rust·rocket框架
freellf13 小时前
go语言学习进阶
后端·学习·golang