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 }