fix port and email issues

This commit is contained in:
Cipher Vance
2025-11-15 20:23:33 -06:00
parent 0a5bd7c413
commit 49e556b272
5 changed files with 103 additions and 33 deletions

View File

@@ -26,14 +26,14 @@ func LoadConfig() (*Config, error) {
cfg := &Config{
Host: getEnv("HOST", "0.0.0.0"),
Port: getEnv("PORT", "8080"),
DBHost: getEnv("PG_HOST", "localhost"),
DBPort: getEnv("PG_PORT", "5432"),
DBName: getEnv("PG_DATABASE", "newsletter"),
DBUser: getEnv("PG_USER", "postgres"),
Port: getEnv("PORT", "5000"),
DBHost: getEnv("PG_HOST", ""),
DBPort: getEnv("PG_PORT", ""),
DBName: getEnv("PG_DATABASE", ""),
DBUser: getEnv("PG_USER", ""),
DBPass: getEnv("PG_PASSWORD", ""),
SMTPHost: getEnv("SMTP_SERVER", ""),
SMTPPort: getEnv("SMTP_PORT", "587"),
SMTPPort: getEnv("SMTP_PORT", ""),
SMTPUser: getEnv("SMTP_USER", ""),
SMTPPass: getEnv("SMTP_PASSWORD", ""),
}

View File

@@ -1,9 +1,13 @@
package email
import (
"crypto/tls"
"fmt"
"net"
"net/smtp"
"strconv"
"time"
"github.com/wneessen/go-mail"
"landing/internal/config"
)
@@ -19,42 +23,111 @@ func (s *Sender) SendConfirmationEmail(
email string,
unsubscribeLink string,
) error {
client, err := mail.NewClient(
s.cfg.SMTPHost,
mail.WithPort(587),
mail.WithSMTPAuth(mail.SMTPAuthPlain),
mail.WithUsername(s.cfg.SMTPUser),
mail.WithPassword(s.cfg.SMTPPass),
)
// Parse SMTP port from env
port, err := strconv.Atoi(s.cfg.SMTPPort)
if err != nil {
return fmt.Errorf("failed to create mail client: %w", err)
return fmt.Errorf("invalid SMTP port '%s': %w", s.cfg.SMTPPort, err)
}
msg := mail.NewMsg()
if err := msg.From(s.cfg.SMTPUser); err != nil {
return fmt.Errorf("failed to set from: %w", err)
}
if err := msg.To(email); err != nil {
return fmt.Errorf("failed to set to: %w", err)
}
msg.Subject("Thanks for subscribing!")
// Build email message
subject := "Thanks for subscribing!"
htmlBody := fmt.Sprintf(`
<html>
<body>
<h1>Welcome!</h1>
<h1>Welcome to RideAware!</h1>
<p>Thank you for subscribing to our newsletter.</p>
<p><a href="%s">Unsubscribe</a></p>
</body>
</html>
`, unsubscribeLink)
msg.SetBodyString(mail.TypeTextHTML, htmlBody)
message := fmt.Sprintf(
"From: %s\r\nTo: %s\r\nSubject: %s\r\nContent-Type: text/html; charset=utf-8\r\n\r\n%s",
s.cfg.SMTPUser,
email,
subject,
htmlBody,
)
if err := client.DialAndSend(msg); err != nil {
return fmt.Errorf("failed to send email: %w", err)
// Create TLS config
tlsConfig := &tls.Config{
ServerName: s.cfg.SMTPHost,
}
// Send email using smtp.SendMail
addr := fmt.Sprintf("%s:%d", s.cfg.SMTPHost, port)
auth := smtp.PlainAuth("", s.cfg.SMTPUser, s.cfg.SMTPPass, s.cfg.SMTPHost)
// Use a custom dialer with timeout
conn, err := net.DialTimeout("tcp", addr, 10*time.Second)
if err != nil {
return fmt.Errorf("failed to connect to SMTP server: %w", err)
}
defer conn.Close()
client, err := smtp.NewClient(conn, s.cfg.SMTPHost)
if err != nil {
return fmt.Errorf("failed to create SMTP client: %w", err)
}
defer client.Close()
// Start TLS
if err := client.StartTLS(tlsConfig); err != nil {
return fmt.Errorf("failed to start TLS: %w", err)
}
// Authenticate
if err := client.Auth(auth); err != nil {
return fmt.Errorf("failed to authenticate: %w", err)
}
// Set recipient and send
if err := client.Mail(s.cfg.SMTPUser); err != nil {
return fmt.Errorf("failed to set mail from: %w", err)
}
if err := client.Rcpt(email); err != nil {
return fmt.Errorf("failed to set mail to: %w", err)
}
wc, err := client.Data()
if err != nil {
return fmt.Errorf("failed to get data writer: %w", err)
}
defer wc.Close()
if _, err := wc.Write([]byte(message)); err != nil {
return fmt.Errorf("failed to write message: %w", err)
}
if err := client.Quit(); err != nil {
return fmt.Errorf("failed to quit SMTP: %w", err)
}
return nil
}
// TestConnection tests SMTP connection without sending email
func (s *Sender) TestConnection() error {
port, err := strconv.Atoi(s.cfg.SMTPPort)
if err != nil {
return fmt.Errorf("invalid SMTP port '%s': %w", s.cfg.SMTPPort, err)
}
// Test TCP connection
addr := fmt.Sprintf("%s:%d", s.cfg.SMTPHost, port)
conn, err := net.DialTimeout("tcp", addr, 10*time.Second)
if err != nil {
return fmt.Errorf("TCP connection failed to %s: %w", addr, err)
}
defer conn.Close()
// Test SMTP connection
client, err := smtp.NewClient(conn, s.cfg.SMTPHost)
if err != nil {
return fmt.Errorf("failed to create SMTP client: %w", err)
}
defer client.Close()
return nil
}