在现代 Web 开发中,邮件发送功能是一个常见的需求,特别是在用户注册、密码重置、通知等场景中,往往需要通过邮件发送验证码或其他信息。本文将介绍如何在 Go 语言中封装一个通用的邮件发送包,支持验证码发送和通用邮件发送。
目标
封装一个邮件发送的包
支持 SMTP 协议发送邮件
提供发送验证码和普通邮件的功能
通过结构体和方法实现面向对象的设计
完善的单元测试,确保代码健壮性
依赖包
在开始之前,需要引入以下依赖包:- 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 的单元测试库。
项目结构- ├── 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邮件发送内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:互联网
免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作! |
|