nidus-sync/comms/email/email.go

103 lines
3.4 KiB
Go
Raw Normal View History

package email
import (
"context"
"fmt"
"github.com/Gleipnir-Technology/nidus-sync/config"
"github.com/rs/zerolog/log"
"resty.dev/v3"
)
type attachmentRequest struct {
Filename string `json:"filename"`
Content string `json:"content"`
}
type Request struct {
From string `json:"from"`
To string `json:"to"`
CC []string `json:"cc,omitempty"`
BCC []string `json:"bcc,omitempty"`
Subject string `json:"subject"`
Text string `json:"text"`
HTML string `json:"html,omitempty"`
Attachments []attachmentRequest `json:"attachments,omitempty"`
Sender string `json:"sender"`
ReplyTo string `json:"replyTo,omitempty"`
InReplyTo string `json:"inReplyTo,omitempty"`
References []string `json:"references,omitempty"`
}
type emailEnvelope struct {
From string `json:"from"`
To []string `json:"to"`
}
type emailResponseError struct {
StatusCode int `json:"statusCode"`
Error string `json:"error"`
Message string `json:"message"`
}
type emailResponse struct {
IsRedacted bool `json:"is_redacted"`
CreatedAt string `json:"created_at"`
HardBounces []string `json:"hard_bounces"`
SoftBounces []string `json:"soft_bounces"`
IsBounce bool `json:"is_bounce"`
Alias string `json:"alias"`
Domain string `json:"domain"`
User string `json:"user"`
Status string `json:"status"`
IsLocked bool `json:"is_locked"`
Envelope emailEnvelope `json:"envelope"`
RequireTLS bool `json:"requireTLS"`
MessageID string `json:"messageId"`
Headers map[string]string `json:"headers"`
Date string `json:"date"`
Subject string `json:"subject"`
Accepted []string `json:"accepted"`
Deliveries []string `json:"deliveries"`
RejectedErrors []string `json:"rejectedErrors"`
ID string `json:"id"`
Object string `json:"object"`
UpdatedAt string `json:"updated_at"`
Link string `json:"link"`
Message string `json:"message"`
}
var FORWARDEMAIL_EMAIL_POST_API = "https://api.forwardemail.net/v1/emails"
func Send(ctx context.Context, email Request) (result emailResponse, err error) {
client := resty.New()
var err_resp emailResponseError
r, err := client.R().
SetBasicAuth(config.ForwardEmailAPIToken, "").
SetBody(email).
SetContext(ctx).
SetError(&err_resp).
SetHeader("Content-Type", "application/json").
SetResult(&result).
Post(FORWARDEMAIL_EMAIL_POST_API)
if err != nil {
return result, fmt.Errorf("Failed to marshal email request: %w", err)
}
if r.IsError() {
2026-02-18 21:38:16 +00:00
log.Error().
Int("status", err_resp.StatusCode).
Str("error", err_resp.Error).
Str("msg", err_resp.Message).
Str("email.from", email.From).
Str("email.sender", email.Sender).
Str("email.subject", email.Subject).
Str("email.to", email.To).
Str("email.text", email.Text).
Msg("Email send error")
return result, fmt.Errorf("Error response %d from email service: %s (%s)", err_resp.StatusCode, err_resp.Message, err_resp.Error)
}
return result, nil
}