Go 语言封装邮件发送功能

Go 语言封装邮件发送功能

  • [🏆 目标](#🏆 目标)
  • [📦 依赖包](#📦 依赖包)
  • [🌟 项目结构](#🌟 项目结构)
  • [🚀 代码实现](#🚀 代码实现)
  • [🛠️ 主要方法说明](#🛠️ 主要方法说明)
  • [🧪 单元测试](#🧪 单元测试)
  • [🌈 使用示例](#🌈 使用示例)
  • [🏆 代码亮点](#🏆 代码亮点)
  • [🌟 改进方向](#🌟 改进方向)
  • [🚀 总结](#🚀 总结)

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


🏆 目标

封装一个邮件发送的包

支持 SMTP 协议发送邮件

提供发送验证码和普通邮件的功能

通过结构体和方法实现面向对象的设计

完善的单元测试,确保代码健壮性


📦 依赖包

在开始之前,需要引入以下依赖包:

bash 复制代码
go get github.com/jordan-wright/email
go get go.uber.org/zap
go get github.com/stretchr/testify
github.com/jordan-wright/email:一个常用的 Go 语言邮件发送库,简化 SMTP 发送流程。

go.uber.org/zap:Uber 开发的高效日志库,用于记录日志。

github.com/stretchr/testify:Go 的单元测试库。

🌟 项目结构

bash 复制代码
├── email
│   ├── email.go
│   └── email_test.go
├── model
│   └── cache.go
├── pkg
│   └── logger.go
├── go.mod
├── go.sum
└── main.go

🚀 代码实现

📌 email/email.go

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

go 复制代码
package email

import (
	"fmt"
	"gin-mall/model"
	"gin-mall/pkg/logger"
	"net/smtp"
	"time"

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

// Email 邮件
type Email struct {
	config  Config   // 邮件配置
	From    string   // 发件人
	To      []string // 收件人
	Subject string   // 主题
	Body    string   // 内容
}

// Config 邮件配置
type Config struct {
	SMTPServer string // SMTP服务器
	SMTPPort   int    // SMTP端口
	Username   string // 用户名
	Password   string // 密码
}

// NewEmail 创建Email实例
func NewEmail(config Config) *Email {
	e := &Email{config: config}
	e.From = config.Username
	return e
}

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

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

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

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

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

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

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

	eClient := email.NewEmail()
	eClient.From = e.From
	eClient.To = e.To
	eClient.Subject = e.Subject
	eClient.Text = []byte(e.Body)

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

	return nil
}

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

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

	return e.Send()
}

🛠️ 主要方法说明

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

🧪 单元测试

📌 email/email_test.go

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

go 复制代码
package email

import (
	"testing"

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

func TestSendEmail(t *testing.T) {
	config := Config{
		SMTPServer: "smtp.163.com",
		SMTPPort:   25,
		Username:   "[email protected]",
		Password:   "your-password",
	}

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

	email.SetFrom(config.Username)
	email.AppendTo("[email protected]")
	email.SetSubject("Test Email")
	email.SetBody("This is a test email.")

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

	t.Logf("Email sent successfully")
}

🌈 使用示例

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

go 复制代码
package main

import (
	"log"
	"gin-mall/email"
)

func main() {
	config := email.Config{
		SMTPServer: "smtp.163.com",
		SMTPPort:   25,
		Username:   "[email protected]",
		Password:   "your-password",
	}

	email := email.NewEmail(config)
	email.SetFrom(config.Username)
	email.AppendTo("[email protected]")
	email.SetSubject("Welcome to GinMall")
	email.SetBody("Thank you for signing up to GinMall!")

	err := email.Send()
	if err != nil {
		log.Fatalf("Failed to send email: %v", err)
	} else {
		log.Println("Email sent successfully")
	}
}

🏆 代码亮点

✅ 面向对象设计,封装良好

✅ 使用 go.uber.org/zap 记录日志

✅ 使用 github.com/jordan-wright/email 简化 SMTP 发送

✅ 使用 github.com/stretchr/testify 进行单元测试


🌟 改进方向

  1. 支持 HTML 格式的邮件内容

  2. 支持添加附件

  3. 通过配置文件设置邮件参数

  4. 添加邮件发送失败的重试机制


🚀 总结

通过封装 github.com/jordan-wright/email,我们可以快速实现邮件发送功能。封装良好的结构体和方法,使代码更易于扩展和复用。希望本文能帮助你在 Go 项目中高效地实现邮件功能!

相关推荐
Cao12345678932122 分钟前
扫雷-C语言版
c语言·开发语言
小奏技术32 分钟前
Kafka要保证消息的发送和消费顺序性似乎没那么简单
后端·kafka
天堂的恶魔94633 分钟前
QT —— 信号和槽(槽函数)
开发语言·qt
小五Z33 分钟前
Redis--事务
redis·分布式·后端·缓存
Asthenia041234 分钟前
线上服务频繁FullGC分析
后端
牛马baby37 分钟前
Springboot 自动装配原理是什么?SPI 原理又是什么?
java·spring boot·后端
水w39 分钟前
【Python爬虫】详细入门指南
开发语言·爬虫·python·scrapy·beautifulsoup
Asthenia04121 小时前
AtomicStampedReference实现原理分析
后端
Starwow1 小时前
微服务之gRPC
后端·微服务·golang
Asthenia04121 小时前
AtomicMarkableReference如何解决ABA问题:深入分析
后端