Files
mail/email.go

80 lines
1.8 KiB
Go
Raw Normal View History

2023-06-15 09:45:14 -04:00
package main
import (
2023-06-15 10:30:20 -04:00
"bytes"
2023-06-15 09:45:14 -04:00
"os"
2023-06-15 12:02:09 -04:00
"path/filepath"
2023-06-15 10:30:20 -04:00
"strings"
2023-06-15 09:45:14 -04:00
tea "github.com/charmbracelet/bubbletea"
"github.com/resendlabs/resend-go"
2023-06-15 10:30:20 -04:00
"github.com/yuin/goldmark"
2023-06-15 09:45:14 -04:00
)
2023-06-15 10:30:20 -04:00
const TO_SEPARATOR = ","
2023-06-15 09:45:14 -04:00
// sendEmailSuccessMsg is the tea.Msg handled by Bubble Tea when the email has
// been sent successfully.
type sendEmailSuccessMsg struct{}
// sendEmailFailureMsg is the tea.Msg handled by Bubble Tea when the email has
// failed to send.
type sendEmailFailureMsg error
// sendEmailCmd returns a tea.Cmd that sends the email.
func (m Model) sendEmailCmd() tea.Cmd {
return func() tea.Msg {
attachments := make([]string, len(m.Attachments.Items()))
for i, a := range m.Attachments.Items() {
2023-06-15 12:05:07 -04:00
attachments[i] = a.FilterValue()
2023-06-15 09:45:14 -04:00
}
2023-06-15 10:30:20 -04:00
err := sendEmail(strings.Split(m.To.Value(), TO_SEPARATOR), m.From.Value(), m.Subject.Value(), m.Body.Value(), attachments)
2023-06-15 09:45:14 -04:00
if err != nil {
return sendEmailFailureMsg(err)
}
return sendEmailSuccessMsg{}
}
}
2023-06-15 12:02:09 -04:00
func sendEmail(to []string, from, subject, body string, paths []string) error {
2023-06-15 09:45:14 -04:00
client := resend.NewClient(os.Getenv(RESEND_API_KEY))
2023-06-15 10:30:20 -04:00
var html, text = bytes.NewBufferString(""), bytes.NewBufferString("")
err := goldmark.Convert([]byte(body), html)
if err != nil {
text.WriteString(body)
}
2023-06-15 12:02:09 -04:00
attachments := make([]resend.Attachment, len(paths))
for i, a := range paths {
2023-06-15 15:37:47 -04:00
f, err := os.ReadFile(a)
2023-06-15 12:02:09 -04:00
if err != nil {
continue
}
attachments[i] = resend.Attachment{
2023-06-15 15:37:47 -04:00
Content: string(f),
2023-06-15 12:02:09 -04:00
Filename: filepath.Base(a),
}
}
if len(attachments) == 0 {
attachments = nil
}
2023-06-15 09:45:14 -04:00
request := &resend.SendEmailRequest{
2023-06-15 12:02:09 -04:00
From: from,
To: to,
Subject: subject,
Html: html.String(),
Text: text.String(),
Attachments: attachments,
2023-06-15 09:45:14 -04:00
}
2023-06-15 10:30:20 -04:00
_, err = client.Emails.Send(request)
2023-06-15 09:45:14 -04:00
if err != nil {
return err
}
return nil
}