102 lines
3.4 KiB
Go
102 lines
3.4 KiB
Go
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() {
|
|
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
|
|
}
|