package main
import (
"fmt"
"log"
"time"
"github.com/wneessen/go-mail"
)
func sendUpdateEmail(subject, body, recipient string) bool {
client, err := mail.NewClient(
config.SMTPServer,
mail.WithPort(config.SMTPPort),
mail.WithSMTPAuth(mail.SMTPAuthPlain),
mail.WithUsername(config.SMTPUser),
mail.WithPassword(config.SMTPPassword),
mail.WithTimeout(10*time.Second),
)
if err != nil {
log.Printf("Failed to create mail client: %v", err)
return false
}
defer client.Close()
m := mail.NewMsg()
if err := m.From(config.SenderEmail); err != nil {
log.Printf("Failed to set from: %v", err)
return false
}
if err := m.To(recipient); err != nil {
log.Printf("Failed to set to: %v", err)
return false
}
m.Subject(subject)
unsubLink := fmt.Sprintf(
"https://%s/unsubscribe?email=%s",
config.BaseURL,
recipient,
)
htmlBody := fmt.Sprintf(
"%s
If you ever wish to unsubscribe, "+
"please click here",
body, unsubLink,
)
m.SetBodyString(mail.TypeTextHTML, htmlBody)
if err := client.Send(m); err != nil {
log.Printf("Failed to send email to %s: %v", recipient, err)
return false
}
log.Printf("Update email sent to: %s", recipient)
return true
}
func processSendUpdateEmail(subject, body string) (string, error) {
subscribers, err := getAllEmails()
if err != nil {
return "Failed to retrieve subscribers", err
}
if len(subscribers) == 0 {
return "No subscribers found.", nil
}
for _, email := range subscribers {
if !sendUpdateEmail(subject, body, email) {
return fmt.Sprintf("Failed to send to %s", email),
nil
}
}
// Log newsletter
_, err = db.Exec(
"INSERT INTO newsletters (subject, body) VALUES ($1, $2)",
subject, body,
)
if err != nil {
log.Printf("Error logging newsletter: %v", err)
}
return "Email has been sent to all subscribers.", nil
}