第二遍打卡,使用 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 包

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!