diff --git a/cmd/web/main.go b/cmd/web/main.go index bb00722..7e2c875 100644 --- a/cmd/web/main.go +++ b/cmd/web/main.go @@ -33,7 +33,9 @@ func main() { log.Fatal(err) } defer db.SQL.Close() + defer close(app.MailChan) + fmt.Println("Starting mail listener...") fmt.Printf("Starting application on port %s\n", portNumber) srv := &http.Server{ @@ -52,6 +54,19 @@ func run() (*driver.DB, error) { gob.Register(models.Room{}) gob.Register(models.Restriction{}) + mailChan := make(chan models.MailData) + app.MailChan = mailChan + + listenForMail() + + msg := models.MailData{ + To: "John@do.do", + From: "me@here.com", + Subject: "mail", + Content: "Hello, world", + } + app.MailChan <- msg + // change this to true when in production app.InProduction = false diff --git a/cmd/web/send-mail.go b/cmd/web/send-mail.go new file mode 100644 index 0000000..1522a01 --- /dev/null +++ b/cmd/web/send-mail.go @@ -0,0 +1,43 @@ +package main + +import ( + "go-udemy-web-1/internal/models" + "log" + "time" + + mail "github.com/xhit/go-simple-mail" +) + +func listenForMail() { + go func() { + for { + msg := <-app.MailChan + sendMsg(msg) + } + }() +} + +func sendMsg(m models.MailData) { + server := mail.NewSMTPClient() + server.Host = "localhost" + server.Port = 1025 // fake port + server.KeepAlive = false + server.ConnectTimeout = 10 * time.Second + server.SendTimeout = 10 * time.Second + + client, err := server.Connect() + if err != nil { + errorLog.Println(err) + } + + email := mail.NewMSG() + email.SetFrom(m.From).AddTo(m.To).SetSubject(m.Subject) + email.SetBody(mail.TextHTML, m.Content) + + err = email.Send(client) + if err != nil { + log.Println(err) + } else { + log.Println("Email sent") + } +} diff --git a/go.mod b/go.mod index 12580d3..b47f765 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 github.com/jackc/pgconn v1.14.3 github.com/jackc/pgx/v5 v5.6.0 + github.com/xhit/go-simple-mail v2.2.2+incompatible ) require ( diff --git a/go.sum b/go.sum index 07e1ed4..36ea518 100644 --- a/go.sum +++ b/go.sum @@ -36,6 +36,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/xhit/go-simple-mail v2.2.2+incompatible h1:Hm2VGfLqiQJ/NnC8SYsrPOPyVYIlvP2kmnotP4RIV74= +github.com/xhit/go-simple-mail v2.2.2+incompatible/go.mod h1:I8Ctg6vIJZ+Sv7k/22M6oeu/tbFumDY0uxBuuLbtU7Y= golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= diff --git a/internal/config/config.go b/internal/config/config.go index 4cf270e..05b5e26 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1,6 +1,7 @@ package config import ( + "go-udemy-web-1/internal/models" "html/template" "log" @@ -15,4 +16,5 @@ type AppConfig struct { InfoLog *log.Logger ErrorLog *log.Logger Session *scs.SessionManager + MailChan chan models.MailData } diff --git a/internal/models/models.go b/internal/models/models.go index f3c38aa..d244557 100644 --- a/internal/models/models.go +++ b/internal/models/models.go @@ -1,6 +1,8 @@ package models -import "time" +import ( + "time" +) // User is the user model type User struct { @@ -58,3 +60,11 @@ type RoomRestriction struct { ReservationID int RestrictionID int } + +// MailData holds an email message +type MailData struct { + To string + From string + Subject string + Content string +}