Files
warmbly/internal/client/goog/send.go
T
Máté Mészáros (Laptop) 41624a6f79 Analytics & Tracking
2026-01-29 05:59:04 +01:00

100 lines
2.2 KiB
Go

package goog
import (
"context"
"encoding/base64"
"fmt"
"strings"
"github.com/warmbly/warmbly/internal/models"
"google.golang.org/api/gmail/v1"
)
func (c *Client) SendMessage(
ctx context.Context,
to, cc, bcc []string,
messageID,
subject, bodyPlain, bodyHTML string,
parent *models.EmailMessageData,
customHeaders ...map[string]string,
) (*gmail.Message, error) {
// Compose headers
headers := []*gmail.MessagePartHeader{
{Name: "From", Value: c.GetAddress()},
{Name: "To", Value: strings.Join(to, ", ")},
{Name: "Subject", Value: subject},
{Name: "Message-ID", Value: messageID},
}
if len(cc) > 0 {
headers = append(headers, &gmail.MessagePartHeader{
Name: "Cc",
Value: strings.Join(cc, ", "),
})
}
if len(bcc) > 0 {
headers = append(headers, &gmail.MessagePartHeader{
Name: "Bcc",
Value: strings.Join(bcc, ", "),
})
}
if parent != nil && parent.MessageID != "" {
headers = append(headers,
&gmail.MessagePartHeader{Name: "In-Reply-To", Value: fmt.Sprintf("<%s>", parent.MessageID)},
&gmail.MessagePartHeader{Name: "References", Value: fmt.Sprintf("<%s>", parent.MessageID)},
)
}
// Add custom headers (e.g., X-Warmbly-Token for warmup)
if len(customHeaders) > 0 {
for k, v := range customHeaders[0] {
headers = append(headers, &gmail.MessagePartHeader{Name: k, Value: v})
}
}
// Compose parts
var parts []*gmail.MessagePart
// Plain text part
parts = append(parts, &gmail.MessagePart{
MimeType: "text/plain",
Body: &gmail.MessagePartBody{
Data: base64.URLEncoding.EncodeToString([]byte(bodyPlain)),
},
})
// HTML part (optional)
if bodyHTML != "" {
parts = append(parts, &gmail.MessagePart{
MimeType: "text/html",
Body: &gmail.MessagePartBody{
Data: base64.URLEncoding.EncodeToString([]byte(bodyHTML)),
},
})
}
// Full message
msg := &gmail.Message{
Payload: &gmail.MessagePart{
MimeType: "multipart/alternative",
Headers: headers,
Parts: parts,
},
}
// Threading
if parent != nil && parent.ThreadID != "" {
msg.ThreadId = parent.ThreadID
}
// Send via Gmail API
sent, err := c.srv.Users.Messages.Send("me", msg).Do()
if err != nil {
return nil, fmt.Errorf("send message failed: %w", err)
}
return sent, nil
}