package order import ( "context" "fmt" "net/mail" "strings" "github.com/mailersend/mailersend-go" ) // MailerSendEmailSender sends email through the MailerSend API using the // official Go SDK. It implements the EmailSender interface. type MailerSendEmailSender struct { client *mailersend.Mailersend defaultFrom mail.Address } // NewMailerSendEmailSender creates a new MailerSend-backed sender. func NewMailerSendEmailSender(apiKey string, defaultFrom mail.Address) (*MailerSendEmailSender, error) { if strings.TrimSpace(apiKey) == "" { return nil, fmt.Errorf("mailersend sender: missing API key") } if strings.TrimSpace(defaultFrom.Address) == "" { return nil, fmt.Errorf("mailersend sender: missing default from address") } return &MailerSendEmailSender{ client: mailersend.NewMailersend(apiKey), defaultFrom: defaultFrom, }, nil } // DefaultFrom returns the default sender address configured for this sender. func (s *MailerSendEmailSender) DefaultFrom() mail.Address { return s.defaultFrom } // Send delivers the rendered email message through the MailerSend API. func (s *MailerSendEmailSender) Send(ctx context.Context, msg EmailMessage) error { if strings.TrimSpace(msg.From.Address) == "" { return fmt.Errorf("mailersend sender: missing from address") } if len(msg.To) == 0 { return fmt.Errorf("mailersend sender: missing recipients") } if strings.TrimSpace(msg.Subject) == "" { return fmt.Errorf("mailersend sender: missing subject") } if strings.TrimSpace(msg.TextBody) == "" && strings.TrimSpace(msg.HTMLBody) == "" { return fmt.Errorf("mailersend sender: missing body") } message := s.client.Email.NewMessage() fromName := msg.From.Name if fromName == "" { fromName = s.defaultFrom.Name } message.SetFrom(mailersend.From{ Name: fromName, Email: msg.From.Address, }) recipients := make([]mailersend.Recipient, 0, len(msg.To)) for _, rcpt := range msg.To { recipients = append(recipients, mailersend.Recipient{ Name: rcpt.Name, Email: rcpt.Address, }) } message.SetRecipients(recipients) message.SetSubject(msg.Subject) if strings.TrimSpace(msg.HTMLBody) != "" { message.SetHTML(msg.HTMLBody) } if strings.TrimSpace(msg.TextBody) != "" { message.SetText(msg.TextBody) } _, err := s.client.Email.Send(ctx, message) if err != nil { return fmt.Errorf("mailersend sender: %w", err) } return nil }