第二遍打卡,使用 gomail 实现
driver_interface.go
package mail
type From struct {
Address string
Name string
}
type Email struct {
From
To []string
Bcc []string
Cc []string
Subject string
Text string
HTML string
}
type Driver interface {
Send(email Email) error
}
driver_smtp.go
package mail
import (
"github.com/wuvikr/gohub01/pkg/config"
"github.com/wuvikr/gohub01/pkg/logger"
"gopkg.in/gomail.v2"
)
type SMTP struct {
}
func (s *SMTP) Send(email Email) error {
// 1. 获取 SMTP 配置
host := config.MustGet[string]("mail.smtp.host")
port := config.MustGet[int]("mail.smtp.port")
username := config.MustGet[string]("mail.smtp.username")
password := config.MustGet[string]("mail.smtp.password")
// 2. 创建邮件消息
m := gomail.NewMessage()
m.SetHeader("From", email.From.Address)
m.SetHeader("To", email.To...)
if len(email.Cc) > 0 {
m.SetHeader("Cc", email.Cc...)
}
if len(email.Bcc) > 0 {
m.SetHeader("Bcc", email.Bcc...)
}
m.SetHeader("Subject", email.Subject)
m.SetBody("text/html", string(email.HTML))
// m.Attach("/home/Alex/lolcat.jpg")
logger.DebugJson("发送邮件信息", "Message", m)
// 3. 连接到 SMTP 服务器发送邮件
d := gomail.NewDialer(host, port, username, password)
if err := d.DialAndSend(m); err != nil {
logger.ErrorStr("发送邮件失败", err.Error())
return err
}
logger.Info("发送邮件成功")
return nil
}
mail.go
package mail
import "sync"
type Mailer struct {
Driver Driver
}
var (
once sync.Once
internalMailer *Mailer
)
func NewMailer() *Mailer {
once.Do(func() {
internalMailer = &Mailer{
Driver: &SMTP{},
}
})
return internalMailer
}
func (m *Mailer) Send(email Email) error {
return m.Driver.Send(email)
}
修改点
- 获取 stmp 配置改为在 driver_smtp里实现的时候直接获取,而不是 mail 调用的时候传参
- 使用了 gomail 代替了 email 实现
至于获取配置这里我也修改成了泛型的方式,感兴趣可以参考配置章节下面的讨论:代码速记:使用泛型改造 config 包
推荐文章: