Installing a mailer package and setting up a mail channel
This commit is contained in:
		@ -33,7 +33,10 @@ func main() {
 | 
				
			|||||||
		log.Fatal(err)
 | 
							log.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defer db.SQL.Close()
 | 
						defer db.SQL.Close()
 | 
				
			||||||
 | 
						defer close(app.MailChan)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fmt.Println("Starting mail listener...")
 | 
				
			||||||
 | 
						listenForMail()
 | 
				
			||||||
	fmt.Printf("Starting application on port %s\n", portNumber)
 | 
						fmt.Printf("Starting application on port %s\n", portNumber)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	srv := &http.Server{
 | 
						srv := &http.Server{
 | 
				
			||||||
@ -52,6 +55,17 @@ func run() (*driver.DB, error) {
 | 
				
			|||||||
	gob.Register(models.Room{})
 | 
						gob.Register(models.Room{})
 | 
				
			||||||
	gob.Register(models.Restriction{})
 | 
						gob.Register(models.Restriction{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mailChan := make(chan models.MailData)
 | 
				
			||||||
 | 
						app.MailChan = mailChan
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						msg := models.MailData{
 | 
				
			||||||
 | 
							To:      "John@do.do",
 | 
				
			||||||
 | 
							From:    "me@here.com",
 | 
				
			||||||
 | 
							Subject: "mail",
 | 
				
			||||||
 | 
							Content: "Hello, <strong>world</strong>",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						app.MailChan <- msg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// change this to true when in production
 | 
						// change this to true when in production
 | 
				
			||||||
	app.InProduction = false
 | 
						app.InProduction = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										43
									
								
								cmd/web/send-mail.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								cmd/web/send-mail.go
									
									
									
									
									
										Normal file
									
								
							@ -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")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							@ -20,6 +20,7 @@ require (
 | 
				
			|||||||
	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2
 | 
						github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2
 | 
				
			||||||
	github.com/jackc/pgconn v1.14.3
 | 
						github.com/jackc/pgconn v1.14.3
 | 
				
			||||||
	github.com/jackc/pgx/v5 v5.6.0
 | 
						github.com/jackc/pgx/v5 v5.6.0
 | 
				
			||||||
 | 
						github.com/xhit/go-simple-mail v2.2.2+incompatible
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								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.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
				
			||||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
 | 
					github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
 | 
				
			||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 | 
					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 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
 | 
				
			||||||
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
 | 
					golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
 | 
				
			||||||
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
 | 
					golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
package config
 | 
					package config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"go-udemy-web-1/internal/models"
 | 
				
			||||||
	"html/template"
 | 
						"html/template"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -15,4 +16,5 @@ type AppConfig struct {
 | 
				
			|||||||
	InfoLog       *log.Logger
 | 
						InfoLog       *log.Logger
 | 
				
			||||||
	ErrorLog      *log.Logger
 | 
						ErrorLog      *log.Logger
 | 
				
			||||||
	Session       *scs.SessionManager
 | 
						Session       *scs.SessionManager
 | 
				
			||||||
 | 
						MailChan      chan models.MailData
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,8 @@
 | 
				
			|||||||
package models
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "time"
 | 
					import (
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// User is the user model
 | 
					// User is the user model
 | 
				
			||||||
type User struct {
 | 
					type User struct {
 | 
				
			||||||
@ -58,3 +60,11 @@ type RoomRestriction struct {
 | 
				
			|||||||
	ReservationID int
 | 
						ReservationID int
 | 
				
			||||||
	RestrictionID int
 | 
						RestrictionID int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MailData holds an email message
 | 
				
			||||||
 | 
					type MailData struct {
 | 
				
			||||||
 | 
						To      string
 | 
				
			||||||
 | 
						From    string
 | 
				
			||||||
 | 
						Subject string
 | 
				
			||||||
 | 
						Content string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user