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:     "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️、发送邮件示例

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

** 发送普通邮件**

go 复制代码
err := utils.Email("receiver@example.com", "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 应用中,实现用户通知、系统告警等功能。如果你在开发过程中遇到问题,欢迎留言交流!

相关推荐
睡一觉就好了。25 分钟前
快速排序——霍尔排序,前后指针排序,非递归排序
数据结构·算法·排序算法
李梨同学丶2 小时前
0201好虫子周刊
后端
思想在飞肢体在追2 小时前
Springboot项目配置Nacos
java·spring boot·后端·nacos
历程里程碑2 小时前
Linux 17 程序地址空间
linux·运维·服务器·开发语言·数据结构·笔记·排序算法
Loo国昌5 小时前
【垂类模型数据工程】第四阶段:高性能 Embedding 实战:从双编码器架构到 InfoNCE 损失函数详解
人工智能·后端·深度学习·自然语言处理·架构·transformer·embedding
ONE_PUNCH_Ge5 小时前
Go 语言泛型
开发语言·后端·golang
良许Linux6 小时前
DSP的选型和应用
后端·stm32·单片机·程序员·嵌入式
不光头强6 小时前
spring boot项目欢迎页设置方式
java·spring boot·后端
Tingjct6 小时前
十大排序算法——交换排序(一)
c语言·开发语言·数据结构·算法·排序算法
怪兽毕设6 小时前
基于SpringBoot的选课调查系统
java·vue.js·spring boot·后端·node.js·选课调查系统