• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    使用Go语言封装实现邮件发送功能

    发布者: 嘉6148 | 发布时间: 2025-8-14 11:22| 查看数: 25| 评论数: 0|帖子模式

    在现代 Web 开发中,邮件发送功能是一个常见的需求,特别是在用户注册、密码重置、通知等场景中,往往需要通过邮件发送验证码或其他信息。本文将介绍如何在 Go 语言中封装一个通用的邮件发送包,支持验证码发送和通用邮件发送。

    目标

    封装一个邮件发送的包
    支持 SMTP 协议发送邮件
    提供发送验证码和普通邮件的功能
    通过结构体和方法实现面向对象的设计
    完善的单元测试,确保代码健壮性

    依赖包

    在开始之前,需要引入以下依赖包:
    1. go get github.com/jordan-wright/email
    2. go get go.uber.org/zap
    3. go get github.com/stretchr/testify
    复制代码

    • github.com/jordan-wright/email:一个常用的 Go 语言邮件发送库,简化 SMTP 发送流程。
    • go.uber.org/zap:Uber 开发的高效日志库,用于记录日志。
    • github.com/stretchr/testify:Go 的单元测试库。
    项目结构
    1. ├── email│   ├── email.go│   └── email_test.go├── model│   └── cache.go├── pkg│   └── logger.go├── go.mod├── go.sum└── main.go
    复制代码
    代码实现

    email/email.go
    创建 email/email.go 文件,封装邮件发送功能。
    1. package email

    2. import (
    3.         "fmt"
    4.         "gin-mall/model"
    5.         "gin-mall/pkg/logger"
    6.         "net/smtp"
    7.         "time"

    8.         "github.com/jordan-wright/email"
    9.         "go.uber.org/zap"
    10. )

    11. // Email 邮件
    12. type Email struct {
    13.         config  Config   // 邮件配置
    14.         From    string   // 发件人
    15.         To      []string // 收件人
    16.         Subject string   // 主题
    17.         Body    string   // 内容
    18. }

    19. // Config 邮件配置
    20. type Config struct {
    21.         SMTPServer string // SMTP服务器
    22.         SMTPPort   int    // SMTP端口
    23.         Username   string // 用户名
    24.         Password   string // 密码
    25. }

    26. // NewEmail 创建Email实例
    27. func NewEmail(config Config) *Email {
    28.         e := &Email{config: config}
    29.         e.From = config.Username
    30.         return e
    31. }

    32. // SetFrom 设置发件人
    33. func (e *Email) SetFrom(from string) {
    34.         e.From = from
    35. }

    36. // SetTo 设置收件人
    37. func (e *Email) SetTo(to []string) {
    38.         e.To = to
    39. }

    40. // AppendTo 添加收件人
    41. func (e *Email) AppendTo(to string) {
    42.         e.To = append(e.To, to)
    43. }

    44. // SetSubject 设置邮件主题
    45. func (e *Email) SetSubject(subject string) {
    46.         e.Subject = subject
    47. }

    48. // SetBody 设置邮件内容
    49. func (e *Email) SetBody(body string) {
    50.         e.Body = body
    51. }

    52. // Send 发送邮件
    53. func (e *Email) Send() error {
    54.         auth := smtp.PlainAuth("", e.config.Username, e.config.Password, e.config.SMTPServer)

    55.         host := fmt.Sprintf("%s:%d", e.config.SMTPServer, e.config.SMTPPort)

    56.         eClient := email.NewEmail()
    57.         eClient.From = e.From
    58.         eClient.To = e.To
    59.         eClient.Subject = e.Subject
    60.         eClient.Text = []byte(e.Body)

    61.         err := eClient.Send(host, auth)
    62.         if err != nil {
    63.                 return err
    64.         }

    65.         return nil
    66. }

    67. // SendVerifyCode 发送验证码
    68. func (e *Email) SendVerifyCode(receiver, code, key string) error {
    69.         // 保存验证码到缓存
    70.         err := model.CacheDb.Set(key, code, 5*time.Minute)
    71.         if err != nil {
    72.                 logger.Error("设置缓存失败", zap.Error(err))
    73.                 return err
    74.         }

    75.         // 发送邮件
    76.         msg := fmt.Sprintf("【XXX】您的验证码是: %s, 请在5分钟内完成验证.", code)
    77.         e.AppendTo(receiver)
    78.         e.SetSubject("GinMall 验证码")
    79.         e.SetBody(msg)

    80.         return e.Send()
    81. }
    复制代码
    主要方法说明

    方法名功能说明NewEmail创建新的邮件实例通过传入 SMTP 配置,创建 Email 结构体SetFrom设置发件人可自定义发件人SetTo设置收件人直接设置收件人数组AppendTo添加收件人动态添加收件人SetSubject设置主题设置邮件的标题SetBody设置内容设置邮件的内容Send发送邮件通过 SMTP 协议发送邮件SendVerifyCode发送验证码生成并发送验证码
    单元测试

    email/email_test.go
    创建 email/email_test.go,对邮件发送功能进行测试。
    1. package email

    2. import (
    3.         "testing"

    4.         "github.com/stretchr/testify/assert"
    5. )

    6. func TestSendEmail(t *testing.T) {
    7.         config := Config{
    8.                 SMTPServer: "smtp.163.com",
    9.                 SMTPPort:   25,
    10.                 Username:   "your-email@163.com",
    11.                 Password:   "your-password",
    12.         }

    13.         email := NewEmail(config)
    14.         assert.NotNil(t, email)

    15.         email.SetFrom(config.Username)
    16.         email.AppendTo("receiver@example.com")
    17.         email.SetSubject("Test Email")
    18.         email.SetBody("This is a test email.")

    19.         err := email.Send()
    20.         assert.Nil(t, err)

    21.         t.Logf("Email sent successfully")
    22. }
    复制代码
    使用示例

    在 main.go 文件中直接调用封装好的方法来发送邮件:
    1. package main

    2. import (
    3.         "log"
    4.         "gin-mall/email"
    5. )

    6. func main() {
    7.         config := email.Config{
    8.                 SMTPServer: "smtp.163.com",
    9.                 SMTPPort:   25,
    10.                 Username:   "your-email@163.com",
    11.                 Password:   "your-password",
    12.         }

    13.         email := email.NewEmail(config)
    14.         email.SetFrom(config.Username)
    15.         email.AppendTo("receiver@example.com")
    16.         email.SetSubject("Welcome to GinMall")
    17.         email.SetBody("Thank you for signing up to GinMall!")

    18.         err := email.Send()
    19.         if err != nil {
    20.                 log.Fatalf("Failed to send email: %v", err)
    21.         } else {
    22.                 log.Println("Email sent successfully")
    23.         }
    24. }
    复制代码
    代码亮点

    ✅ 面向对象设计,封装良好
    ✅ 使用 go.uber.org/zap 记录日志
    ✅ 使用 github.com/jordan-wright/email 简化 SMTP 发送
    ✅ 使用 github.com/stretchr/testify 进行单元测试

    改进方向

    支持 HTML 格式的邮件内容
    支持添加附件
    通过配置文件设置邮件参数
    添加邮件发送失败的重试机制

    总结

    通过封装 github.com/jordan-wright/email,我们可以快速实现邮件发送功能。封装良好的结构体和方法,使代码更易于扩展和复用。希
    到此这篇关于使用Go语言封装实现邮件发送功能的文章就介绍到这了,更多相关Go邮件发送内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表