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 小时前
go中锁的入门到进阶使用
开发语言·后端·golang
草捏子8 小时前
从CPU原理看:为什么你的代码会让CPU"原地爆炸"?
后端·cpu
嘟嘟MD9 小时前
程序员副业 | 2025年3月复盘
后端·创业
胡图蛋.9 小时前
Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
java·spring boot·后端
无责任此方_修行中9 小时前
关于 Node.js 原生支持 TypeScript 的总结
后端·typescript·node.js
吃海鲜的骆驼10 小时前
SpringBoot详细教程(持续更新中...)
java·spring boot·后端
迷雾骑士10 小时前
SpringBoot中WebMvcConfigurer注册多个拦截器(addInterceptors)时的顺序问题(二)
java·spring boot·后端·interceptor
uhakadotcom10 小时前
Thrift2: HBase 多语言访问的利器
后端·面试·github
Asthenia041211 小时前
Java 类加载规则深度解析:从双亲委派到 JDBC 与 Tomcat 的突破
后端
方圆想当图灵11 小时前
从 Java 到 Go:面向对象的巨人与云原生的轻骑兵
后端·代码规范