feat(mail): #132 unify env variables and send mails with smtp
All checks were successful
Build Docker Image / Explore-Gitea-Actions (push) Successful in 46s
All checks were successful
Build Docker Image / Explore-Gitea-Actions (push) Successful in 46s
This commit is contained in:
@@ -56,6 +56,7 @@ Pros:
|
|||||||
- AWS is a big player in the market
|
- AWS is a big player in the market
|
||||||
Cons:
|
Cons:
|
||||||
- AWS is a big player in the market
|
- AWS is a big player in the market
|
||||||
|
- Setups in AWS with IAM are pretty hard
|
||||||
|
|
||||||
##### Mailgun
|
##### Mailgun
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"me-fit/middleware"
|
"me-fit/middleware"
|
||||||
"me-fit/service"
|
"me-fit/service"
|
||||||
|
"me-fit/utils"
|
||||||
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -13,6 +14,10 @@ func getHandler(db *sql.DB) http.Handler {
|
|||||||
|
|
||||||
router.HandleFunc("/", service.HandleIndexAnd404(db))
|
router.HandleFunc("/", service.HandleIndexAnd404(db))
|
||||||
|
|
||||||
|
router.HandleFunc("/mail", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
utils.SendWelcomeMail("timwundenberg@outlook.de")
|
||||||
|
})
|
||||||
|
|
||||||
// Serve static files (CSS, JS and images)
|
// Serve static files (CSS, JS and images)
|
||||||
router.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static/"))))
|
router.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static/"))))
|
||||||
|
|
||||||
|
|||||||
31
main.go
31
main.go
@@ -20,6 +20,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Error loading .env file")
|
log.Fatal("Error loading .env file")
|
||||||
}
|
}
|
||||||
|
utils.MustInitEnv()
|
||||||
|
|
||||||
db, err := sql.Open("sqlite3", "./data.db")
|
db, err := sql.Open("sqlite3", "./data.db")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -27,19 +28,9 @@ func main() {
|
|||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
utils.RunMigrations(db)
|
utils.MustRunMigrations(db)
|
||||||
|
|
||||||
var prometheusServer = http.Server{
|
startPrometheus()
|
||||||
Addr: ":8081",
|
|
||||||
Handler: promhttp.Handler(),
|
|
||||||
}
|
|
||||||
go func() {
|
|
||||||
slog.Info("Starting prometheus server on " + prometheusServer.Addr)
|
|
||||||
err := prometheusServer.ListenAndServe()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
var server = http.Server{
|
var server = http.Server{
|
||||||
Addr: ":8080",
|
Addr: ":8080",
|
||||||
@@ -52,3 +43,19 @@ func main() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func startPrometheus() {
|
||||||
|
|
||||||
|
var prometheusServer = http.Server{
|
||||||
|
Addr: ":8081",
|
||||||
|
Handler: promhttp.Handler(),
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
slog.Info("Starting prometheus server on " + prometheusServer.Addr)
|
||||||
|
err := prometheusServer.ListenAndServe()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Could not start prometheus server: ", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,21 +1,15 @@
|
|||||||
package middleware
|
package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"me-fit/utils"
|
||||||
"log/slog"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func EnableCors(next http.Handler) http.Handler {
|
func EnableCors(next http.Handler) http.Handler {
|
||||||
var base_url = os.Getenv("BASE_URL")
|
|
||||||
if base_url == "" {
|
|
||||||
log.Fatal("BASE_URL is not set")
|
|
||||||
}
|
|
||||||
slog.Info("BASE_URL is " + base_url)
|
|
||||||
|
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Access-Control-Allow-Origin", base_url)
|
w.Header().Set("Access-Control-Allow-Origin", utils.BaseUrl)
|
||||||
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, DELETE")
|
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, DELETE")
|
||||||
|
|
||||||
if r.Method == "OPTIONS" {
|
if r.Method == "OPTIONS" {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
_ "github.com/golang-migrate/migrate/v4/source/file"
|
_ "github.com/golang-migrate/migrate/v4/source/file"
|
||||||
)
|
)
|
||||||
|
|
||||||
func RunMigrations(db *sql.DB) {
|
func MustRunMigrations(db *sql.DB) {
|
||||||
driver, err := sqlite3.WithInstance(db, &sqlite3.Config{})
|
driver, err := sqlite3.WithInstance(db, &sqlite3.Config{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|||||||
57
utils/env.go
Normal file
57
utils/env.go
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
SmtpHost string
|
||||||
|
SmtpPort string
|
||||||
|
SmtpUser string
|
||||||
|
SmtpPass string
|
||||||
|
SmtpFromMail string
|
||||||
|
SmtpFromName string
|
||||||
|
BaseUrl string
|
||||||
|
)
|
||||||
|
|
||||||
|
func MustInitEnv() {
|
||||||
|
SmtpHost = os.Getenv("SMTP_HOST")
|
||||||
|
SmtpPort = os.Getenv("SMTP_PORT")
|
||||||
|
SmtpUser = os.Getenv("SMTP_USER")
|
||||||
|
SmtpPass = os.Getenv("SMTP_PASS")
|
||||||
|
SmtpFromMail = os.Getenv("SMTP_FROM_MAIL")
|
||||||
|
SmtpFromName = os.Getenv("SMTP_FROM_NAME")
|
||||||
|
BaseUrl = os.Getenv("BASE_URL")
|
||||||
|
|
||||||
|
if SmtpHost == "" {
|
||||||
|
log.Fatal("SMTP_HOST must be set")
|
||||||
|
}
|
||||||
|
if SmtpPort == "" {
|
||||||
|
log.Fatal("SMTP_PORT must be set")
|
||||||
|
}
|
||||||
|
if SmtpUser == "" {
|
||||||
|
log.Fatal("SMTP_USER must be set")
|
||||||
|
}
|
||||||
|
if SmtpPass == "" {
|
||||||
|
log.Fatal("SMTP_PASS must be set")
|
||||||
|
}
|
||||||
|
if SmtpFromMail == "" {
|
||||||
|
log.Fatal("SMTP_FROM_MAIL must be set")
|
||||||
|
}
|
||||||
|
if SmtpFromName == "" {
|
||||||
|
log.Fatal("SMTP_FROM_NAME must be set")
|
||||||
|
}
|
||||||
|
if BaseUrl == "" {
|
||||||
|
log.Fatal("BASE_URL must be set")
|
||||||
|
}
|
||||||
|
|
||||||
|
slog.Info("BASE_URL is " + BaseUrl)
|
||||||
|
slog.Info("SMTP_HOST is " + SmtpHost)
|
||||||
|
slog.Info("SMTP_PORT is " + SmtpPort)
|
||||||
|
slog.Info("SMTP_USER is " + SmtpUser)
|
||||||
|
slog.Info("SMTP_PASS is " + SmtpPass)
|
||||||
|
slog.Info("SMTP_FROM_MAIL is " + SmtpFromMail)
|
||||||
|
slog.Info("SMTP_FROM_NAME is " + SmtpFromName)
|
||||||
|
}
|
||||||
19
utils/mail.go
Normal file
19
utils/mail.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log/slog"
|
||||||
|
"net/smtp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SendWelcomeMail(to string) {
|
||||||
|
|
||||||
|
auth := smtp.PlainAuth("", SmtpUser, SmtpPass, SmtpHost)
|
||||||
|
|
||||||
|
msg := "From: " + SmtpFromName + " <" + SmtpFromMail + ">\nTo: " + to + "\nSubject: Welcome to me-fit\n\nWelcome to me-fit!"
|
||||||
|
|
||||||
|
err := smtp.SendMail(SmtpHost+":"+SmtpPort, auth, SmtpFromMail, []string{to}, []byte(msg))
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Could not send mail: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user