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 项目中高效地实现邮件功能!

相关推荐
鱼樱前端18 分钟前
阿里巴巴 Druid、C3P0、DBCP 连接池深度对比与实战指南
java·后端
自珍JAVA20 分钟前
正则表达式
后端
我最厉害。,。26 分钟前
-PHP 应用&SQL 二次注入&堆叠执行&DNS 带外&功能点&黑白盒条件
开发语言·sql·php
www_pp_32 分钟前
使用Python和OpenCV进行指纹识别与验证
开发语言·python·opencv
Asthenia041238 分钟前
深入SpringBoot启动流程:自动配置与Bean生命周期核心解析
后端
豌豆花下猫41 分钟前
Python 潮流周刊#95:像人类一样使用计算机(摘要)
后端·python·ai
王达舒19941 小时前
Spring Boot中定时任务Cron表达式的终极指南
java·spring boot·后端
demonlg01121 小时前
Go 语言标准库中Channels,Goroutines详细功能介绍与示例
开发语言·后端·golang
王强你强1 小时前
Spring Boot 启动参数终极解析:如何优雅地控制你的应用?
java·spring boot·后端
vener_2 小时前
基于Flask的通用登录注册模块,并代理跳转到目标网址
后端·python·flask