From b39679740c911ffaf7f484bd0a793cc16d66c3a6 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Sat, 9 Mar 2024 00:28:29 -0600 Subject: [PATCH] Switched to SMTP for email so I can use FastMail --- .env.example | 5 ++- go.mod | 11 +++--- go.sum | 12 ++++++ lib/email.go | 107 ++++++++++++++++++++++++++++++++++++++++++--------- 4 files changed, 111 insertions(+), 24 deletions(-) diff --git a/.env.example b/.env.example index 4250495..9514569 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,9 @@ CLERK_SECRET_KEY="" CLERK_WEBHOOK_SECRET="" -RESEND_API_KEY="" +SMTP_HOST="" +SMTP_PORT="" +SMTP_USERNAME="" +SMTP_PASSWORD="" STRIPE_SECRET_KEY="" REDIS_HOST="" REDIS_PASSWORD="" diff --git a/go.mod b/go.mod index c029dd1..92327cd 100644 --- a/go.mod +++ b/go.mod @@ -12,9 +12,9 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dlclark/regexp2 v1.11.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.2 // indirect + github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/labstack/gommon v0.4.2 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect @@ -25,12 +25,13 @@ require ( golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect ) require ( github.com/alecthomas/assert/v2 v2.4.1 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 github.com/clerkinc/clerk-sdk-go v1.49.0 github.com/disintegration/imaging v1.6.2 github.com/fatih/color v1.16.0 @@ -41,8 +42,8 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/redis/go-redis/v9 v9.5.1 github.com/resendlabs/resend-go v1.7.0 - github.com/stripe/stripe-go/v76 v76.19.0 - github.com/svix/svix-webhooks v1.20.0 + github.com/stripe/stripe-go/v76 v76.20.0 + github.com/svix/svix-webhooks v1.21.0 github.com/yuin/goldmark v1.7.0 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc github.com/zmb3/spotify v1.3.0 diff --git a/go.sum b/go.sum index e3e0eb4..776e029 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,8 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clerkinc/clerk-sdk-go v1.49.0 h1:tJLIAx3qfP2cNQJ/iPq6OF1BSB0NzI3alcOuEueexoA= @@ -32,6 +34,8 @@ github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4Nij github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= github.com/go-jose/go-jose/v3 v3.0.2 h1:2Edjn8Nrb44UvTdp84KU0bBPs1cO7noRCybtS3eJEUQ= github.com/go-jose/go-jose/v3 v3.0.2/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= +github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -39,6 +43,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -79,8 +85,12 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stripe/stripe-go/v76 v76.19.0 h1:aJIs+B8mKOQE90SNOFmnc7j8xyvJT66kpZQVRxXbkf0= github.com/stripe/stripe-go/v76 v76.19.0/go.mod h1:rw1MxjlAKKcZ+3FOXgTHgwiOa2ya6CPq6ykpJ0Q6Po4= +github.com/stripe/stripe-go/v76 v76.20.0 h1:EKxpA+c3+snZlEqZsr6ZQHx684jOAOWkKXurcillVqA= +github.com/stripe/stripe-go/v76 v76.20.0/go.mod h1:rw1MxjlAKKcZ+3FOXgTHgwiOa2ya6CPq6ykpJ0Q6Po4= github.com/svix/svix-webhooks v1.20.0 h1:XJOrxii+YxxivXcs/3I4/8FhDg3pNzEUm4c93RUEiLU= github.com/svix/svix-webhooks v1.20.0/go.mod h1:qGeiECF5WRQElyfF0i2CqUtWk2GQJTgL+EJZ/WRCxok= +github.com/svix/svix-webhooks v1.21.0 h1:ZxoPU2SJGjmRy1qMaeHY1VdZhTaEkHuh3ruy4CrxW3Y= +github.com/svix/svix-webhooks v1.21.0/go.mod h1:qGeiECF5WRQElyfF0i2CqUtWk2GQJTgL+EJZ/WRCxok= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= @@ -170,6 +180,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/lib/email.go b/lib/email.go index ea9dcf0..5d8e54a 100644 --- a/lib/email.go +++ b/lib/email.go @@ -1,31 +1,102 @@ package lib import ( - "fmt" + "crypto/tls" + "log" + "net/smtp" "os" - - "github.com/resendlabs/resend-go" ) -var client *resend.Client - -// init function -func init() { - client = resend.NewClient(os.Getenv("RESEND_API_KEY")) -} - func SendEmail(to_email string, from_email string, from_name string, html string, subject string) { - params := &resend.SendEmailRequest{ - From: from_name + "<" + from_email + ">", - To: []string{to_email}, - Html: html, - Subject: subject, + log.Println("Starting email sending process") + + // Set up authentication information. + auth := smtp.PlainAuth( + "", + os.Getenv("SMTP_USERNAME"), + os.Getenv("SMTP_PASSWORD"), + os.Getenv("SMTP_HOST"), + ) + + log.Println("Authentication set up") + + // Connect to the server, authenticate, set the sender and recipient, + // and send the email all in one step. + msg := []byte("From: " + from_name + " <" + from_email + ">\r\n" + + "To: " + to_email + "\r\n" + + "Subject: " + subject + "\r\n" + + "Content-Type: text/html; charset=UTF-8" + "\r\n" + + "\r\n" + + html + "\r\n") + + tlsconfig := &tls.Config{ + InsecureSkipVerify: false, + ServerName: os.Getenv("SMTP_HOST"), } - sent, err := client.Emails.Send(params) + log.Println("TLS configuration set up") + + c, err := smtp.Dial(os.Getenv("SMTP_HOST") + ":587") if err != nil { - fmt.Println(err.Error()) + log.Println("Error dialing SMTP server:", err) return } - fmt.Println(sent.Id) + + log.Println("Connected to SMTP server") + + if err = c.StartTLS(tlsconfig); err != nil { + log.Println("Error starting TLS:", err) + return + } + + log.Println("TLS started") + + if err = c.Auth(auth); err != nil { + log.Println("Error authenticating with SMTP server:", err) + return + } + + log.Println("Authenticated with SMTP server") + + if err = c.Mail(from_email); err != nil { + log.Println("Error setting sender address:", err) + return + } + + log.Println("Sender address set") + + if err = c.Rcpt(to_email); err != nil { + log.Println("Error setting recipient address:", err) + return + } + + log.Println("Recipient address set") + + w, err := c.Data() + if err != nil { + log.Println("Error getting write closer:", err) + return + } + + log.Println("Got write closer") + + _, err = w.Write(msg) + if err != nil { + log.Println("Error writing message:", err) + return + } + + log.Println("Message written") + + err = w.Close() + if err != nil { + log.Println("Error closing write closer:", err) + return + } + + log.Println("Write closer closed") + + c.Quit() + + log.Println("Email sent successfully") }