package email
import (
"bbs-go/internal/models"
"bbs-go/internal/pkg/bbsurls"
"bytes"
"crypto/tls"
"html/template"
"log/slog"
"net"
"net/smtp"
"github.com/jordan-wright/email"
"bbs-go/internal/pkg/config"
)
var emailTemplate = `
{{.Title}}
{{if .From}}{{.From.Title}} {{end}}{{if .Content}}{{.Content}}{{end}}
{{if .QuoteContent}}
{{.QuoteContent}}
{{end}}
{{if .link}}
{{.link.Title}}
{{end}}
`
// SendTemplateEmail 发送模版邮件
func SendTemplateEmail(from *models.User, to, subject, title, content, quote string, link *models.ActionLink) error {
tpl, err := template.New("emailTemplate").Parse(emailTemplate)
if err != nil {
return err
}
var fromLink *models.ActionLink
if from != nil {
fromLink = &models.ActionLink{
Title: from.Nickname,
Url: bbsurls.UserUrl(from.Id),
}
}
var b bytes.Buffer
err = tpl.Execute(&b, map[string]interface{}{
"From": fromLink,
"Title": title,
"Content": content,
"QuoteContent": quote,
"link": link,
})
if err != nil {
return err
}
html := b.String()
return SendEmail(to, subject, html)
}
// SendEmail 发送邮件
func SendEmail(to string, subject, html string) error {
var (
host = config.Instance.Smtp.Host
port = config.Instance.Smtp.Port
username = config.Instance.Smtp.Username
password = config.Instance.Smtp.Password
ssl = config.Instance.Smtp.SSL
addr = net.JoinHostPort(host, port)
auth = smtp.PlainAuth("", username, password, host)
tlsConfig = &tls.Config{
InsecureSkipVerify: true,
ServerName: host,
}
)
e := email.NewEmail()
e.From = config.Instance.Smtp.Username
e.To = []string{to}
e.Subject = subject
e.HTML = []byte(html)
if ssl {
if err := e.SendWithTLS(addr, auth, tlsConfig); err != nil {
slog.Error("发送邮件异常", slog.Any("err", err))
return err
}
} else {
if err := e.Send(addr, auth); err != nil {
slog.Error("发送邮件异常", slog.Any("err", err))
return err
}
}
return nil
}