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

 更新时间:2025年04月03日 09:53:29   作者:程序员爱钓鱼  
在现代 Web 应用中,邮件通知是一个不可或缺的功能,本文将深入解析一个基于 Go 语言 smtp 协议和 email 库的邮件发送工具,需要的可以了解下

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

Go 语言如何发送邮件

在 Go 语言中,可以使用 net/smtp 标准库发送邮件,但它的 API 设计较为底层,使用起来相对麻烦。因此,我们借助 jordan-wright/email 库来简化邮件发送逻辑,使其更易读、更易用。

本文基于 gin-vue-admin 框架的插件封装了邮件发送工具,支持普通邮件发送、错误告警邮件、邮件测试等功能。

代码实现解析

首先,我们来看核心代码:

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 服务器的配置信息,例如:

GlobalConfig = struct {
    From     string
    Nickname string
    Secret   string
    Host     string
    Port     int
    IsSSL    bool
    To       string
}{
    From:     "your_email@example.com",
    Nickname: "Go Mailer",
    Secret:   "your_smtp_secret", // QQ/163/Gmail 需要使用授权码
    Host:     "smtp.example.com",
    Port:     465,
    IsSSL:    true,
    To:       "receiver@example.com",
}

2、发送邮件示例

以下是调用邮件工具发送邮件的示例:

发送普通邮件

err := utils.Email("receiver@example.com", "Go 邮件测试", "<h1>Hello from Go!</h1>")
if err != nil {
    fmt.Println("邮件发送失败:", err)
} else {
    fmt.Println("邮件发送成功!")
}

发送错误告警邮件

err := utils.ErrorToEmail("系统错误", "<p>检测到异常,请立即处理!</p>")
if err != nil {
    fmt.Println("告警邮件发送失败:", err)
} else {
    fmt.Println("告警邮件发送成功!")
}

发送测试邮件

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 服务器地址正确,例如:

  • Gmailsmtp.gmail.com,端口 465(SSL)或 587(TLS)
  • QQ 邮箱smtp.qq.com,端口 465(SSL)

总结

本篇文章介绍了如何使用 Go 语言通过 smtp 发送邮件,并提供了完整的代码实现。无论是普通邮件、错误告警邮件,还是测试邮件,这个工具都能轻松搞定!

到此这篇关于Go语言轻松实现邮件发送通知功能的完全指南的文章就介绍到这了,更多相关Go邮件发送通知内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go json omitempty如何实现可选属性

    Go json omitempty如何实现可选属性

    在Go语言中,使用`omitempty`可以帮助我们在进行JSON序列化和反序列化时,忽略结构体中的零值或空值,本文介绍了如何通过将字段类型改为指针类型,并在结构体的JSON标签中添加`omitempty`来实现这一功能,例如,将float32修改为*float32
    2024-09-09
  • Go标准库sync功能实例详解

    Go标准库sync功能实例详解

    Go语言通过goroutine实现轻量级并发,而sync库是并发编程中同步原语的核心集合,提供了多种用于协调goroutine执行、保护共享资源的工具,这篇文章给大家介绍Go标准库sync功能实例详解,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • golang实现整型和字节数组之间的转换操作

    golang实现整型和字节数组之间的转换操作

    这篇文章主要介绍了golang实现整型和字节数组之间的转换操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • gtoken替换jwt实现sso登录的问题小结

    gtoken替换jwt实现sso登录的问题小结

    这篇文章主要介绍了gtoken替换jwt实现sso登录,主要介绍了替换jwt的原因分析及gtoken的优势,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • goland 恢复已更改文件的操作

    goland 恢复已更改文件的操作

    这篇文章主要介绍了goland 恢复已更改文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 简单易用的Go逗号comma ok模式使用详解

    简单易用的Go逗号comma ok模式使用详解

    这篇文章主要为大家介绍了简单易用的Go逗号comma ok模式使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 一文详解Golang中new和make的区别

    一文详解Golang中new和make的区别

    在Go语言中,new和make是两个用于创建对象的内建函数。本文将详细介绍new和make的区别,并通过多个方面的分析和代码示例,帮助大家理解它们的使用场景
    2023-05-05
  • golang waitgroup的具体使用

    golang waitgroup的具体使用

    本文主要介绍了golang waitgroup的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Go字符串查找的20种实现方式

    Go字符串查找的20种实现方式

    本文总结了Go语言中20种字符串查找方法,从标准库API到经典高效算法,再到数据结构辅助和高级技巧,覆盖了从单次查找、多个模式查找、前缀查询到模糊匹配等场景,每种方法都有其适用场景和时间空间复杂度,并提供了详细的应用建议,需要的朋友可以参考下
    2026-05-05
  • 使用go net实现简单的redis通信协议

    使用go net实现简单的redis通信协议

    本文主要介绍了go net实现简单的redis通信协议,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论