199 lines
7.5 KiB
Go
199 lines
7.5 KiB
Go
package email
|
|
|
|
// DeliveryProvider identifies email sending service.
|
|
type DeliveryProvider string
|
|
|
|
const (
|
|
ProviderSMTP DeliveryProvider = "smtp"
|
|
ProviderBrevo DeliveryProvider = "brevo"
|
|
ProviderSendGrid DeliveryProvider = "sendgrid"
|
|
ProviderResend DeliveryProvider = "resend"
|
|
ProviderPostmark DeliveryProvider = "postmark"
|
|
ProviderMailgun DeliveryProvider = "mailgun"
|
|
)
|
|
|
|
// SendEmailParams defines parameters for sending an email.
|
|
type SendEmailParams struct {
|
|
FromEmail string `json:"fromEmail"`
|
|
FromName string `json:"fromName,omitempty"`
|
|
ToEmail string `json:"toEmail"`
|
|
ToName string `json:"toName,omitempty"`
|
|
ReplyTo string `json:"replyTo,omitempty"`
|
|
Subject string `json:"subject"`
|
|
BodyText string `json:"bodyText"`
|
|
BodyHTML string `json:"bodyHtml,omitempty"`
|
|
MessageID string `json:"messageId,omitempty"`
|
|
InReplyTo string `json:"inReplyTo,omitempty"`
|
|
References string `json:"references,omitempty"`
|
|
Headers map[string]string `json:"headers,omitempty"`
|
|
Attachments []EmailAttachment `json:"attachments,omitempty"`
|
|
}
|
|
|
|
// EmailAttachment defines file attachments in email.
|
|
type EmailAttachment struct {
|
|
Filename string `json:"filename"`
|
|
ContentType string `json:"contentType"`
|
|
ContentB64 string `json:"contentB64"`
|
|
}
|
|
|
|
// ClientConfig holds configuration for initializing Email client.
|
|
type ClientConfig struct {
|
|
Provider DeliveryProvider
|
|
APIKey string
|
|
BaseURL string
|
|
SMTPHost string
|
|
SMTPPort int
|
|
SMTPUser string
|
|
SMTPPassword string
|
|
SMTPUseTLS bool
|
|
// SMTPAllowInsecure skips certificate verification and refuses opportunistic
|
|
// STARTTLS. It exists so a channel can be bound to a self-signed test server
|
|
// such as Mailpit or MailHog; it weakens transport security and must never be
|
|
// set for a real mailbox.
|
|
SMTPAllowInsecure bool
|
|
Domain string // For Mailgun (e.g. mg.example.com)
|
|
}
|
|
|
|
// InboundEmailPayload represents normalized parsed inbound email.
|
|
type InboundEmailPayload struct {
|
|
FromEmail string `json:"fromEmail"`
|
|
FromName string `json:"fromName,omitempty"`
|
|
ToEmail string `json:"toEmail"`
|
|
ToName string `json:"toName,omitempty"`
|
|
Subject string `json:"subject"`
|
|
BodyText string `json:"bodyText"`
|
|
BodyHTML string `json:"bodyHtml,omitempty"`
|
|
MessageID string `json:"messageId,omitempty"`
|
|
InReplyTo string `json:"inReplyTo,omitempty"`
|
|
References string `json:"references,omitempty"`
|
|
Headers map[string]string `json:"headers,omitempty"`
|
|
Attachments []EmailAttachment `json:"attachments,omitempty"`
|
|
}
|
|
|
|
// --- Provider specific Inbound & Outbound Structs ---
|
|
|
|
// BrevoSendEmailRequest payload for Brevo v3 API.
|
|
type BrevoSendEmailRequest struct {
|
|
Sender BrevoEmailContact `json:"sender"`
|
|
To []BrevoEmailContact `json:"to"`
|
|
ReplyTo *BrevoEmailContact `json:"replyTo,omitempty"`
|
|
Subject string `json:"subject"`
|
|
HTMLContent string `json:"htmlContent,omitempty"`
|
|
TextContent string `json:"textContent,omitempty"`
|
|
Headers map[string]string `json:"headers,omitempty"`
|
|
}
|
|
|
|
type BrevoEmailContact struct {
|
|
Name string `json:"name,omitempty"`
|
|
Email string `json:"email"`
|
|
}
|
|
|
|
// SendGridSendEmailRequest payload for SendGrid v3 API.
|
|
type SendGridSendEmailRequest struct {
|
|
Personalizations []SendGridPersonalization `json:"personalizations"`
|
|
From SendGridContact `json:"from"`
|
|
ReplyTo *SendGridContact `json:"reply_to,omitempty"`
|
|
Subject string `json:"subject"`
|
|
Content []SendGridContent `json:"content"`
|
|
Headers map[string]string `json:"headers,omitempty"`
|
|
}
|
|
|
|
type SendGridPersonalization struct {
|
|
To []SendGridContact `json:"to"`
|
|
Subject string `json:"subject,omitempty"`
|
|
}
|
|
|
|
type SendGridContact struct {
|
|
Email string `json:"email"`
|
|
Name string `json:"name,omitempty"`
|
|
}
|
|
|
|
type SendGridContent struct {
|
|
Type string `json:"type"`
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
// ResendSendEmailRequest payload for Resend API.
|
|
type ResendSendEmailRequest struct {
|
|
From string `json:"from"`
|
|
To []string `json:"to"`
|
|
ReplyTo string `json:"reply_to,omitempty"`
|
|
Subject string `json:"subject"`
|
|
Text string `json:"text,omitempty"`
|
|
HTML string `json:"html,omitempty"`
|
|
Headers map[string]string `json:"headers,omitempty"`
|
|
Attachments []ResendAttachment `json:"attachments,omitempty"`
|
|
}
|
|
|
|
type ResendAttachment struct {
|
|
Filename string `json:"filename"`
|
|
Content string `json:"content"`
|
|
}
|
|
|
|
// PostmarkSendEmailRequest payload for Postmark API.
|
|
type PostmarkSendEmailRequest struct {
|
|
From string `json:"From"`
|
|
To string `json:"To"`
|
|
ReplyTo string `json:"ReplyTo,omitempty"`
|
|
Subject string `json:"Subject"`
|
|
TextBody string `json:"TextBody,omitempty"`
|
|
HtmlBody string `json:"HtmlBody,omitempty"`
|
|
Headers []PostmarkHeader `json:"Headers,omitempty"`
|
|
Attachments []PostmarkAttach `json:"Attachments,omitempty"`
|
|
}
|
|
|
|
type PostmarkHeader struct {
|
|
Name string `json:"Name"`
|
|
Value string `json:"Value"`
|
|
}
|
|
|
|
type PostmarkAttach struct {
|
|
Name string `json:"Name"`
|
|
Content string `json:"Content"`
|
|
ContentType string `json:"ContentType"`
|
|
}
|
|
|
|
// GenericInboundWebhook represents standard webhook JSON format (Cloudflare Email Routing, AWS SES, Generic).
|
|
type GenericInboundWebhook struct {
|
|
From string `json:"from"`
|
|
FromName string `json:"from_name,omitempty"`
|
|
To string `json:"to"`
|
|
ToName string `json:"to_name,omitempty"`
|
|
Subject string `json:"subject"`
|
|
Text string `json:"text,omitempty"`
|
|
HTML string `json:"html,omitempty"`
|
|
Body string `json:"body,omitempty"`
|
|
MessageID string `json:"message_id,omitempty"`
|
|
InReplyTo string `json:"in_reply_to,omitempty"`
|
|
References string `json:"references,omitempty"`
|
|
Headers map[string]string `json:"headers,omitempty"`
|
|
}
|
|
|
|
// BrevoInboundItem represents an item in Brevo inbound webhook.
|
|
type BrevoInboundItem struct {
|
|
UUID []string `json:"Uuid,omitempty"`
|
|
Sender string `json:"Sender,omitempty"`
|
|
Recipient string `json:"Recipient,omitempty"`
|
|
Subject string `json:"Subject,omitempty"`
|
|
RawHTMLBody string `json:"RawHtmlBody,omitempty"`
|
|
RawTextBody string `json:"RawTextBody,omitempty"`
|
|
Headers map[string]string `json:"Headers,omitempty"`
|
|
}
|
|
|
|
type BrevoInboundWebhook struct {
|
|
Items []BrevoInboundItem `json:"items,omitempty"`
|
|
}
|
|
|
|
// PostmarkInboundWebhook represents Postmark inbound email payload.
|
|
type PostmarkInboundWebhook struct {
|
|
From string `json:"From"`
|
|
FromName string `json:"FromName,omitempty"`
|
|
To string `json:"To"`
|
|
Subject string `json:"Subject"`
|
|
TextBody string `json:"TextBody,omitempty"`
|
|
HtmlBody string `json:"HtmlBody,omitempty"`
|
|
MessageID string `json:"MessageID,omitempty"`
|
|
MailboxHash string `json:"MailboxHash,omitempty"`
|
|
Headers []PostmarkHeader `json:"Headers,omitempty"`
|
|
}
|