package main import ( "errors" "fmt" "log" "net/http" "time" "github.com/tsawler/toolbox" mail "github.com/xhit/go-simple-mail/v2" ) type MailData struct { From string `json:"from"` To string `json:"to"` Subject string `json:"subject"` Content string `json:"content"` } func (app *Config) SendMail(w http.ResponseWriter, r *http.Request) { var mailData MailData err := app.Tools.ReadJSON(w, r, &mailData) if err != nil { log.Println(err) app.Tools.ErrorJSON(w, err) return } log.Println("Sending mail") if mailData.From == "" || mailData.To == "" || (mailData.Subject == "" && mailData.Content == "") { log.Println("Invalid mail") app.Tools.ErrorJSON(w, errors.New("invalid mail"), http.StatusBadRequest) return } err = app.SendMsg(mailData) if err != nil { log.Println(err) app.Tools.ErrorJSON(w, err) return } var payload toolbox.JSONResponse payload.Error = false payload.Message = fmt.Sprintf("mail sent to %s", mailData.To) app.Tools.WriteJSON(w, http.StatusAccepted, payload) } func (app *Config) SendMsg(m MailData) error { server := mail.NewSMTPClient() server.Host = app.Host server.Port = app.Port server.KeepAlive = false server.ConnectTimeout = 10 * time.Second server.SendTimeout = 10 * time.Second smtpClient, err := server.Connect() if err != nil { log.Println(err) return err } // Maybe add a template email := mail.NewMSG() email.SetFrom(m.From). AddTo(m.To). SetSubject(m.Subject). SetBody(mail.TextHTML, m.Content) err = email.Send(smtpClient) if err != nil { log.Println(err) return err } log.Printf("Email sent to %s", m.To) return nil }