mirror of
https://github.com/warmbly/warmbly.git
synced 2026-08-19 08:01:16 +00:00
100 lines
2.2 KiB
Go
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
|
|
}
|