package smtpclient import ( "fmt" "net/smtp" "strings" "github.com/pkg/errors" ) var ErrAuthRequired = errors.New("auth required") const CRLF = "\r\n" const FromEmail = "no-reply@fiskerinc.com" type SMTPInterface interface { Auth(username string, password string) Send(from string, to []string, subject string, body string) error Close() } func NewSMTP(host string, port int) SMTPInterface { return &SMTP{ Host: host, Port: port, } } type SMTP struct { Host string Port int Username string auth smtp.Auth } func (s *SMTP) Auth(username string, password string) { s.auth = smtp.PlainAuth("", username, password, s.Host) } func (s *SMTP) Send(from string, to []string, subject string, body string) error { if s.auth == nil { return ErrAuthRequired } msg := []string{ fmt.Sprintf("From: %s", from), fmt.Sprintf("To: %s", strings.Join(to, ", ")), fmt.Sprintf("Subject: %s", subject), "", fmt.Sprintf("%s%s", body, CRLF), } addr := fmt.Sprintf("%s:%d", s.Host, s.Port) return smtp.SendMail(addr, s.auth, from, to, []byte(strings.Join(msg, CRLF))) } func (s *SMTP) Close() { s.Host = "" s.Username = "" s.auth = nil }