Mike Schwörer
358c238f3d
Some checks failed
Build Docker and Deploy / Run goext test-suite (push) Failing after 1m28s
70 lines
2.0 KiB
Go
70 lines
2.0 KiB
Go
package googleapi
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
"gogs.mikescher.com/BlackForestBytes/goext"
|
|
"gogs.mikescher.com/BlackForestBytes/goext/exerr"
|
|
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
|
"io"
|
|
"net/http"
|
|
)
|
|
|
|
type MailRef struct {
|
|
ID string `json:"id"`
|
|
ThreadID string `json:"threadId"`
|
|
LabelIDs []string `json:"labelIds"`
|
|
}
|
|
|
|
func (c *client) SendMail(ctx context.Context, from string, recipients []string, cc []string, bcc []string, subject string, body MailBody, attachments []MailAttachment) (MailRef, error) {
|
|
|
|
mm := encodeMimeMail(from, recipients, cc, bcc, subject, body, attachments)
|
|
|
|
tok, err := c.oauth.AccessToken()
|
|
if err != nil {
|
|
return MailRef{}, exerr.Wrap(err, "").Build()
|
|
}
|
|
|
|
url := fmt.Sprintf("https://gmail.googleapis.com/gmail/v1/users/%s/messages/send?alt=json&prettyPrint=false", "me")
|
|
|
|
msgbody, err := json.Marshal(langext.H{"raw": base64.URLEncoding.EncodeToString([]byte(mm))})
|
|
if err != nil {
|
|
return MailRef{}, exerr.Wrap(err, "").Build()
|
|
}
|
|
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(msgbody))
|
|
if err != nil {
|
|
return MailRef{}, exerr.Wrap(err, "").Build()
|
|
}
|
|
|
|
req.Header.Add("Authorization", "Bearer "+tok)
|
|
req.Header.Add("X-Goog-Api-Client", "blackforestbytes-goext/"+goext.GoextVersion)
|
|
req.Header.Add("User-Agent", "blackforestbytes-goext/"+goext.GoextVersion)
|
|
req.Header.Add("Content-Type", "application/json")
|
|
|
|
resp, err := c.http.Do(req)
|
|
if err != nil {
|
|
return MailRef{}, exerr.Wrap(err, "").Build()
|
|
}
|
|
|
|
respBody, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return MailRef{}, exerr.Wrap(err, "").Build()
|
|
}
|
|
|
|
if resp.StatusCode != 200 {
|
|
return MailRef{}, exerr.New(exerr.TypeGoogleStatuscode, "gmail returned non-200 statuscode").Int("sc", resp.StatusCode).Str("body", string(respBody)).Build()
|
|
}
|
|
|
|
var respObj MailRef
|
|
err = json.Unmarshal(respBody, &respObj)
|
|
if err != nil {
|
|
return MailRef{}, exerr.Wrap(err, "").Str("body", string(respBody)).Build()
|
|
}
|
|
|
|
return respObj, nil
|
|
}
|