82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
// internal/queue/email_service.go
|
|
package queue
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"gopkg.in/gomail.v2"
|
|
)
|
|
|
|
// EmailService defines the interface for sending emails
|
|
type EmailService interface {
|
|
Send(to string, subject string, body string) error
|
|
}
|
|
|
|
// SMTPEmailService implements EmailService using SMTP
|
|
type SMTPEmailService struct {
|
|
dialer *gomail.Dialer
|
|
from string
|
|
}
|
|
|
|
type SMTPConfig struct {
|
|
Host string
|
|
Port int
|
|
Username string
|
|
Password string
|
|
From string
|
|
}
|
|
|
|
func NewSMTPEmailService(config SMTPConfig) *SMTPEmailService {
|
|
dialer := gomail.NewDialer(
|
|
config.Host,
|
|
config.Port,
|
|
config.Username,
|
|
config.Password,
|
|
)
|
|
|
|
return &SMTPEmailService{
|
|
dialer: dialer,
|
|
from: config.From,
|
|
}
|
|
}
|
|
|
|
func (s *SMTPEmailService) Send(to string, subject string, body string) error {
|
|
m := gomail.NewMessage()
|
|
m.SetHeader("From", s.from)
|
|
m.SetHeader("To", to)
|
|
m.SetHeader("Subject", subject)
|
|
m.SetBody("text/html", body)
|
|
|
|
if err := s.dialer.DialAndSend(m); err != nil {
|
|
return fmt.Errorf("failed to send email: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MockEmailService implements EmailService for testing
|
|
type MockEmailService struct {
|
|
SentEmails []MockEmail
|
|
}
|
|
|
|
type MockEmail struct {
|
|
To string
|
|
Subject string
|
|
Body string
|
|
}
|
|
|
|
func NewMockEmailService() *MockEmailService {
|
|
return &MockEmailService{
|
|
SentEmails: make([]MockEmail, 0),
|
|
}
|
|
}
|
|
|
|
func (s *MockEmailService) Send(to string, subject string, body string) error {
|
|
s.SentEmails = append(s.SentEmails, MockEmail{
|
|
To: to,
|
|
Subject: subject,
|
|
Body: body,
|
|
})
|
|
return nil
|
|
}
|