package lib import ( "crypto/tls" "fmt" "net" "net/smtp" "os" "strings" ) var ( smtpHost, smtpPort, smtpUser, smtpToken, smtpFrom string ) func EmailInit(envPath string) error { data, err := os.ReadFile(envPath) if err != nil { return err } for _, line := range strings.Split(string(data), "\n") { parts := strings.SplitN(line, "=", 2) if len(parts) != 2 { continue } switch parts[0] { case "SMTP_HOST": smtpHost = parts[1] case "SMTP_PORT": smtpPort = parts[1] case "SMTP_USER": smtpUser = parts[1] case "SMTP_TOKEN": smtpToken = parts[1] case "SMTP_FROM_NAME": smtpFrom = parts[1] } } return nil } func SendEmail(to, fromName, subject, content string) error { if smtpHost == "" { return nil } displayFrom := smtpFrom if fromName != "" { displayFrom = fromName + " via inou" } html := wrapEmail(content) msg := "From: " + displayFrom + " <" + smtpUser + ">\r\n" + "To: " + to + "\r\n" + "Subject: " + subject + "\r\n" + "MIME-Version: 1.0\r\n" + "Content-Type: text/html; charset=utf-8\r\n\r\n" + html conn, err := net.Dial("tcp", smtpHost+":"+smtpPort) if err != nil { return err } defer conn.Close() client, err := smtp.NewClient(conn, smtpHost) if err != nil { return err } defer client.Close() if err = client.StartTLS(&tls.Config{ServerName: smtpHost}); err != nil { return err } if err = client.Auth(smtp.PlainAuth("", smtpUser, smtpToken, smtpHost)); err != nil { return err } if err = client.Mail(smtpUser); err != nil { return err } if err = client.Rcpt(to); err != nil { return err } w, err := client.Data() if err != nil { return err } _, err = w.Write([]byte(msg)) if err != nil { return err } return w.Close() } func wrapEmail(content string) string { return fmt.Sprintf(`
%s
`, content) }