51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
package mail
|
|
|
|
import (
|
|
"fmt"
|
|
"net/smtp"
|
|
"sysmonitord/internal/config"
|
|
"sysmonitord/pkg/logger"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type Mailer struct {
|
|
cfg config.EmailConfig
|
|
}
|
|
|
|
func NewMailer(cfg config.EmailConfig) *Mailer {
|
|
return &Mailer{cfg: cfg}
|
|
}
|
|
|
|
func (m *Mailer) Send(subject, body string) error {
|
|
if !m.cfg.Enabled {
|
|
logger.Log.Debug("[notifier] 未启用邮件通知,跳过....")
|
|
return nil
|
|
}
|
|
|
|
headers := make(map[string]string)
|
|
headers["From"] = m.cfg.SMTP.Username
|
|
headers["To"] = m.cfg.Recipients[0]
|
|
headers["Subject"] = subject
|
|
|
|
message := ""
|
|
for k, v := range headers {
|
|
message += fmt.Sprintf("%s: %s\r\n", k, v)
|
|
}
|
|
message += "\r\n" + body
|
|
|
|
auth := smtp.PlainAuth("", m.cfg.SMTP.Username, m.cfg.SMTP.Password, m.cfg.SMTP.Server)
|
|
addr := fmt.Sprintf("%s:%d", m.cfg.SMTP.Server, m.cfg.SMTP.Port)
|
|
|
|
logger.Log.Info("[notifier] 发送邮件通知", zap.String("subject", subject), zap.String("to", m.cfg.Recipients[0]))
|
|
|
|
err := smtp.SendMail(addr, auth, m.cfg.SMTP.Username, m.cfg.Recipients, []byte(message))
|
|
if err != nil {
|
|
logger.Log.Error("[notifier] 发送邮件失败", zap.Error(err))
|
|
return err
|
|
}
|
|
|
|
logger.Log.Info("[notifier] 邮件发送成功")
|
|
return nil
|
|
}
|