package utils import ( "crypto/tls" "fmt" "gitee.ltd/lxh/logger/log" "gopkg.in/gomail.v2" "mime" "path/filepath" "wireguard-dashboard/config" ) type mail struct { md *gomail.Dialer } func Mail() mail { mailDialer := gomail.NewDialer(config.Config.Mail.Host, config.Config.Mail.Port, config.Config.Mail.User, config.Config.Mail.Password) mailDialer.TLSConfig = &tls.Config{ InsecureSkipVerify: config.Config.Mail.SkipTls, } return mail{mailDialer} } // SendMail // @description: 发送普通邮件 // @receiver mail // @param subject // @param toAddress // @param content // @return err func (m mail) SendMail(subject, toAddress, content string) (err error) { msg := gomail.NewMessage() msg.SetHeader("From", msg.FormatAddress(m.md.Username, "wireguard-dashboard")) msg.SetHeader("To", toAddress) msg.SetHeader("Subject", subject) msg.SetBody("text/plain", content) if err = m.md.DialAndSend(msg); err != nil { log.Errorf("发送普通邮件失败: %v", err.Error()) return } return } // SendMailWithAttach // @description: 发送并携带附件 // @receiver m // @param subject // @param toAddress // @param content // @param attachPath // @return err func (m mail) SendMailWithAttach(subject, toAddress, content, attachPath string) (err error) { msg := gomail.NewMessage() msg.SetHeader("From", msg.FormatAddress(m.md.Username, "wireguard-dashboard")) msg.SetHeader("To", toAddress) msg.SetHeader("Subject", subject) msg.SetBody("text/plain", content) rename := m.getFileName(attachPath) msg.Attach(attachPath, gomail.Rename(rename), gomail.SetHeader(map[string][]string{ "Content-Disposition": { fmt.Sprintf(`attachment; filename="%s"`, mime.BEncoding.Encode("UTF-8", rename)), }, })) if err = m.md.DialAndSend(msg); err != nil { log.Errorf("发送普通邮件失败: %v", err.Error()) return } return } // getFileName // @description: 获取文件名 // @receiver m // @param filePath // @return string func (m mail) getFileName(filePath string) string { return filepath.Base(filePath) }