85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
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
|
|
}
|