// Package mail_mock - dev server-backed mock email sender. package mail_mock import ( "bytes" "context" "encoding/json" "fmt" "net/http" "atlas9.dev/c/mail" ) // Sender implements mail.Mailer by posting to a dev server endpoint. // The dev server controls behavior (latency, failure modes) and records // messages in an inbox visible in the dev UI. type Sender struct { URL string // e.g. "http://localhost:8099/mail/send" } type sendReq struct { To string Subject string Text string HTML string } func (s *Sender) Send(ctx context.Context, email string, content mail.Content) error { body, err := json.Marshal(sendReq{ To: email, Subject: content.Subject, Text: content.TextBody, HTML: content.HtmlBody, }) if err != nil { return err } req, err := http.NewRequestWithContext(ctx, http.MethodPost, s.URL, bytes.NewReader(body)) if err != nil { return err } req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { return fmt.Errorf("mock mail: %w", err) } defer resp.Body.Close() if resp.StatusCode >= 400 { return fmt.Errorf("mock mail: server returned %d", resp.StatusCode) } return nil }