add mail service

This commit is contained in:
2024-09-02 20:48:30 +02:00
parent 6630577399
commit 50142e16be
8 changed files with 209 additions and 1 deletions

View File

@ -0,0 +1,81 @@
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
}

View File

@ -0,0 +1,40 @@
package main
import (
"fmt"
"log"
"net/http"
"github.com/tsawler/toolbox"
)
const webPort = "80"
type Config struct {
Host string
Port int
UserName string
Password string
Encryption string
Tools toolbox.Tools
}
func main() {
app := Config{
Host: "localhost",
Port: 1025,
}
log.Printf("Starting mail service on port %s\n", webPort)
// define http server
srv := &http.Server{
Addr: fmt.Sprintf(":%s", webPort),
Handler: app.routes(),
}
err := srv.ListenAndServe()
if err != nil {
log.Panic(err)
}
}

View File

@ -0,0 +1,27 @@
package main
import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/cors"
)
func (app *Config) routes() http.Handler {
mux := chi.NewRouter()
mux.Use(cors.Handler(cors.Options{
AllowedOrigins: []string{"https://*", "http://*"},
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
ExposedHeaders: []string{"Link"},
AllowCredentials: true,
MaxAge: 300,
}))
mux.Use(middleware.Heartbeat("/ping"))
mux.Post("/send-mail", app.SendMail)
return nil
}