Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go邮件发送

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

作者:熬了夜的程序员

在现代 Web 开发中,邮件发送功能是一个常见的需求,本文将介绍如何在 Go 语言中封装一个通用的邮件发送包,支持验证码发送和通用邮件发送,需要的可以参考下

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

目标

封装一个邮件发送的包

支持 SMTP 协议发送邮件

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

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

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

依赖包

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

go get github.com/jordan-wright/email
go get go.uber.org/zap
go get github.com/stretchr/testify

项目结构

├── email
│   ├── email.go
│   └── email_test.go
├── model
│   └── cache.go
├── pkg
│   └── logger.go
├── go.mod
├── go.sum
└── main.go

代码实现

email/email.go

创建 email/email.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,对邮件发送功能进行测试。

package email

import (
	"testing"

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

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

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

	email.SetFrom(config.Username)
	email.AppendTo("receiver@example.com")
	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 文件中直接调用封装好的方法来发送邮件:

package main

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

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

	email := email.NewEmail(config)
	email.SetFrom(config.Username)
	email.AppendTo("receiver@example.com")
	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 进行单元测试

改进方向

支持 HTML 格式的邮件内容

支持添加附件

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

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

总结

通过封装 github.com/jordan-wright/email,我们可以快速实现邮件发送功能。封装良好的结构体和方法,使代码更易于扩展和复用。希

到此这篇关于使用Go语言封装实现邮件发送功能的文章就介绍到这了,更多相关Go邮件发送内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文