使用Go語言封裝實現(xiàn)郵件發(fā)送功能
在現(xiàn)代 Web 開發(fā)中,郵件發(fā)送功能是一個常見的需求,特別是在用戶注冊、密碼重置、通知等場景中,往往需要通過郵件發(fā)送驗證碼或其他信息。本文將介紹如何在 Go 語言中封裝一個通用的郵件發(fā)送包,支持驗證碼發(fā)送和通用郵件發(fā)送。
目標
封裝一個郵件發(fā)送的包
支持 SMTP 協(xié)議發(fā)送郵件
提供發(fā)送驗證碼和普通郵件的功能
通過結構體和方法實現(xiàn)面向對象的設計
完善的單元測試,確保代碼健壯性
依賴包
在開始之前,需要引入以下依賴包:
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 語言郵件發(fā)送庫,簡化 SMTP 發(fā)送流程。
- go.uber.org/zap:Uber 開發(fā)的高效日志庫,用于記錄日志。
- github.com/stretchr/testify:Go 的單元測試庫。
項目結構
│ ├── email.go
│ └── email_test.go
├── model
│ └── cache.go
├── pkg
│ └── logger.go
├── go.mod
├── go.sum
└── main.go
代碼實現(xiàn)
email/email.go
創(chuàng)建 email/email.go 文件,封裝郵件發(fā)送功能。
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 // 發(fā)件人 To []string // 收件人 Subject string // 主題 Body string // 內容 } // Config 郵件配置 type Config struct { SMTPServer string // SMTP服務器 SMTPPort int // SMTP端口 Username string // 用戶名 Password string // 密碼 } // NewEmail 創(chuàng)建Email實例 func NewEmail(config Config) *Email { e := &Email{config: config} e.From = config.Username return e } // SetFrom 設置發(fā)件人 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 發(fā)送郵件 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 發(fā)送驗證碼 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 } // 發(fā)送郵件 msg := fmt.Sprintf("【XXX】您的驗證碼是: %s, 請在5分鐘內完成驗證.", code) e.AppendTo(receiver) e.SetSubject("GinMall 驗證碼") e.SetBody(msg) return e.Send() }
主要方法說明
方法名 | 功能 | 說明 |
---|---|---|
NewEmail | 創(chuàng)建新的郵件實例 | 通過傳入 SMTP 配置,創(chuàng)建 Email 結構體 |
SetFrom | 設置發(fā)件人 | 可自定義發(fā)件人 |
SetTo | 設置收件人 | 直接設置收件人數(shù)組 |
AppendTo | 添加收件人 | 動態(tài)添加收件人 |
SetSubject | 設置主題 | 設置郵件的標題 |
SetBody | 設置內容 | 設置郵件的內容 |
Send | 發(fā)送郵件 | 通過 SMTP 協(xié)議發(fā)送郵件 |
SendVerifyCode | 發(fā)送驗證碼 | 生成并發(fā)送驗證碼 |
單元測試
email/email_test.go
創(chuàng)建 email/email_test.go,對郵件發(fā)送功能進行測試。
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 文件中直接調用封裝好的方法來發(fā)送郵件:
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 發(fā)送
? 使用 github.com/stretchr/testify 進行單元測試
改進方向
支持 HTML 格式的郵件內容
支持添加附件
通過配置文件設置郵件參數(shù)
添加郵件發(fā)送失敗的重試機制
總結
通過封裝 github.com/jordan-wright/email,我們可以快速實現(xiàn)郵件發(fā)送功能。封裝良好的結構體和方法,使代碼更易于擴展和復用。希
到此這篇關于使用Go語言封裝實現(xiàn)郵件發(fā)送功能的文章就介紹到這了,更多相關Go郵件發(fā)送內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang實現(xiàn)基于channel的通用連接池詳解
這篇文章主要給大家介紹了關于golang實現(xiàn)基于channel的通用連接池的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-02-02Go Excelize API源碼閱讀GetPageLayout及SetPageMargins
這篇文章主要為大家介紹了Go Excelize API源碼閱讀GetPageLayout及SetPageMargins的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08