82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/tsawler/toolbox"
|
|
mail "github.com/xhit/go-simple-mail/v2"
|
|
)
|
|
|
|
type MailData struct {
|
|
From string
|
|
To string
|
|
Subject string
|
|
Content string
|
|
}
|
|
|
|
func (app *Config) SendMail(w http.ResponseWriter, r *http.Request) {
|
|
var mailData MailData
|
|
err := json.NewDecoder(r.Body).Decode(&mailData)
|
|
if err != nil {
|
|
log.Println(err)
|
|
app.Tools.ErrorJSON(w, err)
|
|
}
|
|
|
|
if mailData.From == "" || mailData.To == "" ||
|
|
(mailData.Subject == "" && mailData.Content == "") {
|
|
log.Println("Invalid mail")
|
|
app.Tools.ErrorJSON(w, errors.New("invalid mail"), http.StatusBadRequest)
|
|
}
|
|
|
|
err = app.SendMsg(mailData)
|
|
if err != nil {
|
|
log.Println(err)
|
|
app.Tools.ErrorJSON(w, err)
|
|
}
|
|
|
|
var payload toolbox.JSONResponse
|
|
payload.Error = false
|
|
payload.Message = fmt.Sprintf("mail sent to %s", mailData.To)
|
|
|
|
app.Tools.WriteJSON(w, http.StatusOK, 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
|
|
}
|