90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
package utils
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/jordan-wright/email"
|
|
"github.com/spf13/cast"
|
|
"mime"
|
|
"net/smtp"
|
|
"net/textproto"
|
|
"path/filepath"
|
|
"wireguard-ui/model"
|
|
)
|
|
|
|
type mail struct {
|
|
*email.Email
|
|
addr string
|
|
auth smtp.Auth
|
|
conf map[string]string
|
|
}
|
|
|
|
func Mail(conf *model.Setting) *mail {
|
|
// 解析配置文件
|
|
var mailConf = make(map[string]string)
|
|
_ = json.Unmarshal([]byte(conf.Data), &mailConf)
|
|
var m mail
|
|
em := email.NewEmail()
|
|
m.Email = em
|
|
m.auth = smtp.PlainAuth("", mailConf["user"], mailConf["password"], mailConf["host"])
|
|
m.addr = fmt.Sprintf("%s:%s", mailConf["host"], mailConf["port"])
|
|
m.conf = mailConf
|
|
return &m
|
|
}
|
|
|
|
func (m *mail) VerifyConfig() (err error) {
|
|
if m == nil {
|
|
return errors.New("邮件客户端初始化失败")
|
|
}
|
|
|
|
if m.auth == nil || m.addr == "" {
|
|
return errors.New("邮件客户端未完成初始化")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// SendMail
|
|
// @description: 发送附件
|
|
// @receiver m
|
|
// @param to
|
|
// @param subject
|
|
// @param attacheFilePath
|
|
// @return err
|
|
func (m *mail) SendMail(to, subject, content, attacheFilePath string) (err error) {
|
|
m.From = fmt.Sprintf("wg-dashboard <%s>", m.conf["user"])
|
|
m.To = []string{to}
|
|
m.Subject = subject
|
|
m.Text = []byte(content)
|
|
if attacheFilePath != "" {
|
|
atch, err := m.AttachFile(attacheFilePath)
|
|
if err != nil {
|
|
return fmt.Errorf("读取附件文件失败: %v", err.Error())
|
|
}
|
|
emHeader := textproto.MIMEHeader{}
|
|
emHeader.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, mime.BEncoding.Encode("UTF-8", m.getFileName(attacheFilePath))))
|
|
atch.Header = emHeader
|
|
}
|
|
|
|
if cast.ToBool(m.conf["skipTls"]) {
|
|
return m.Send(m.addr, m.auth)
|
|
}
|
|
|
|
tlsConfig := &tls.Config{}
|
|
tlsConfig.InsecureSkipVerify = cast.ToBool(m.conf["skipTls"])
|
|
tlsConfig.ServerName = m.conf["host"]
|
|
|
|
return m.SendWithTLS(m.addr, m.auth, tlsConfig)
|
|
}
|
|
|
|
// getFileName
|
|
// @description: 获取文件名
|
|
// @receiver m
|
|
// @param filePath
|
|
// @return string
|
|
func (m *mail) getFileName(filePath string) string {
|
|
return filepath.Base(filePath)
|
|
}
|