it编程 > 前端脚本 > Golang

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

28人参与 2025-04-24 Golang

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

总结

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

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

(0)

您想发表意见!!点此发布评论

推荐阅读

Go标准库常见错误分析和解决办法

04-24

Go+Gin实现安全多文件上传功能

04-24

Go如何实现Websocket服务以及代理

04-24

使用pprof分析golang内存泄露问题及解决

04-24

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

04-24

go中空接口的具体使用

04-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论