udemy-go-microservices/mail-service/cmd/api/handlers.go

82 lines
1.5 KiB
Go
Raw Normal View History

2024-09-02 18:48:30 +00:00
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
}