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

相关推荐
道之极万物灭1 分钟前
Go小工具合集
开发语言·后端·golang
瑞士卷@1 分钟前
MyBatis入门到精通(Mybatis学习笔记)
java·数据库·后端·mybatis
yuuki23323333 分钟前
【C语言】文件操作(附源码与图片)
c语言·后端
IT_陈寒37 分钟前
Python+AI实战:用LangChain构建智能问答系统的5个核心技巧
前端·人工智能·后端
无名之辈J1 小时前
系统崩溃(OOM)
后端
码农刚子1 小时前
ASP.NET Core Blazor简介和快速入门 二(组件基础)
javascript·后端
间彧1 小时前
Java ConcurrentHashMap如何合理指定初始容量
后端
catchadmin1 小时前
PHP8.5 的新 URI 扩展
开发语言·后端·php
少妇的美梦1 小时前
Maven Profile 教程
后端·maven
白衣鸽子1 小时前
RPO 与 RTO:分布式系统容灾的双子星
后端·架构