package lib import ( "crypto/tls" "fmt" "net" "net/smtp" ) var ( smtpHost, smtpPort, smtpUser, smtpPass, smtpFrom, smtpFromName string ) func SendEmail(to, fromName, subject, content string) error { if smtpHost == "" { return nil } displayName := smtpFromName if fromName != "" { displayName = fromName + " via inou" } html := wrapEmail(content) msg := "From: " + displayName + " <" + smtpFrom + ">\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, smtpPass, smtpHost)); err != nil { return err } if err = client.Mail(smtpFrom); 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) }