Blame


1 1d5ddf5d 2024-02-20 o package apub
2 1d5ddf5d 2024-02-20 o
3 1d5ddf5d 2024-02-20 o import (
4 1d5ddf5d 2024-02-20 o "bytes"
5 1d5ddf5d 2024-02-20 o "fmt"
6 1d5ddf5d 2024-02-20 o "net/mail"
7 71191436 2024-02-28 o "net/smtp"
8 1d5ddf5d 2024-02-20 o "strings"
9 1d5ddf5d 2024-02-20 o "time"
10 1d5ddf5d 2024-02-20 o )
11 1d5ddf5d 2024-02-20 o
12 1d5ddf5d 2024-02-20 o func MarshalMail(activity *Activity) ([]byte, error) {
13 1d5ddf5d 2024-02-20 o buf := &bytes.Buffer{}
14 1d5ddf5d 2024-02-20 o
15 1d5ddf5d 2024-02-20 o actor, err := LookupActor(activity.AttributedTo)
16 1d5ddf5d 2024-02-20 o if err != nil {
17 1d5ddf5d 2024-02-20 o return nil, fmt.Errorf("lookup actor %s: %w", activity.AttributedTo, err)
18 1d5ddf5d 2024-02-20 o }
19 1d5ddf5d 2024-02-20 o fmt.Fprintf(buf, "From: %s\n", actor.Address())
20 1d5ddf5d 2024-02-20 o
21 1d5ddf5d 2024-02-20 o if activity.CC != nil {
22 1d5ddf5d 2024-02-20 o buf.WriteString("To: ")
23 1d5ddf5d 2024-02-20 o rcpt := append(activity.To, activity.CC...)
24 1d5ddf5d 2024-02-20 o var addrs []string
25 1d5ddf5d 2024-02-20 o for _, u := range rcpt {
26 1d5ddf5d 2024-02-20 o if u == ToEveryone {
27 1d5ddf5d 2024-02-20 o continue
28 1d5ddf5d 2024-02-20 o }
29 1d5ddf5d 2024-02-20 o actor, err = LookupActor(u)
30 1d5ddf5d 2024-02-20 o if err != nil {
31 1d5ddf5d 2024-02-20 o return nil, fmt.Errorf("lookup actor %s: %w", u, err)
32 1d5ddf5d 2024-02-20 o }
33 1d5ddf5d 2024-02-20 o addrs = append(addrs, actor.Address().String())
34 1d5ddf5d 2024-02-20 o }
35 1d5ddf5d 2024-02-20 o buf.WriteString(strings.Join(addrs, ", "))
36 1d5ddf5d 2024-02-20 o buf.WriteString("\n")
37 1d5ddf5d 2024-02-20 o }
38 1d5ddf5d 2024-02-20 o
39 1d5ddf5d 2024-02-20 o fmt.Fprintf(buf, "Date: %s\n", activity.Published.Format(time.RFC822))
40 1d5ddf5d 2024-02-20 o fmt.Fprintf(buf, "Message-ID: <%s>\n", activity.ID)
41 1d5ddf5d 2024-02-20 o if activity.Audience != "" {
42 1d5ddf5d 2024-02-20 o fmt.Fprintf(buf, "List-ID: <%s>\n", activity.Audience)
43 1d5ddf5d 2024-02-20 o }
44 1d5ddf5d 2024-02-20 o if activity.InReplyTo != "" {
45 1d5ddf5d 2024-02-20 o fmt.Fprintf(buf, "References: <%s>\n", activity.InReplyTo)
46 1d5ddf5d 2024-02-20 o }
47 1d5ddf5d 2024-02-20 o
48 1d5ddf5d 2024-02-20 o if activity.Source.Content != "" && activity.Source.MediaType == "text/markdown" {
49 1d5ddf5d 2024-02-20 o fmt.Fprintln(buf, "Content-Type: text/plain; charset=utf-8")
50 1d5ddf5d 2024-02-20 o } else {
51 1d5ddf5d 2024-02-20 o fmt.Fprintln(buf, "Content-Type:", activity.MediaType)
52 1d5ddf5d 2024-02-20 o }
53 1d5ddf5d 2024-02-20 o fmt.Fprintln(buf, "Subject:", activity.Name)
54 1d5ddf5d 2024-02-20 o fmt.Fprintln(buf)
55 1d5ddf5d 2024-02-20 o if activity.Source.Content != "" && activity.Source.MediaType == "text/markdown" {
56 1d5ddf5d 2024-02-20 o fmt.Fprintln(buf, activity.Source.Content)
57 1d5ddf5d 2024-02-20 o } else {
58 1d5ddf5d 2024-02-20 o fmt.Fprintln(buf, activity.Content)
59 1d5ddf5d 2024-02-20 o }
60 1d5ddf5d 2024-02-20 o _, err = mail.ReadMessage(bytes.NewReader(buf.Bytes()))
61 1d5ddf5d 2024-02-20 o return buf.Bytes(), err
62 1d5ddf5d 2024-02-20 o }
63 71191436 2024-02-28 o
64 71191436 2024-02-28 o func SendMail(client *smtp.Client, activity *Activity, from string, to ...string) error {
65 71191436 2024-02-28 o b, err := MarshalMail(activity)
66 71191436 2024-02-28 o if err != nil {
67 71191436 2024-02-28 o return fmt.Errorf("marshal to mail message: %w", err)
68 71191436 2024-02-28 o }
69 71191436 2024-02-28 o if err := client.Mail(from); err != nil {
70 71191436 2024-02-28 o return fmt.Errorf("mail command: %w", err)
71 71191436 2024-02-28 o }
72 71191436 2024-02-28 o for _, rcpt := range to {
73 71191436 2024-02-28 o if err := client.Rcpt(rcpt); err != nil {
74 71191436 2024-02-28 o return fmt.Errorf("rcpt command: %w", err)
75 71191436 2024-02-28 o }
76 71191436 2024-02-28 o }
77 71191436 2024-02-28 o wc, err := client.Data()
78 71191436 2024-02-28 o if err != nil {
79 71191436 2024-02-28 o return fmt.Errorf("data command: %w", err)
80 71191436 2024-02-28 o }
81 71191436 2024-02-28 o if _, err := wc.Write(b); err != nil {
82 71191436 2024-02-28 o return fmt.Errorf("write message: %w", err)
83 71191436 2024-02-28 o }
84 71191436 2024-02-28 o if err := wc.Close(); err != nil {
85 71191436 2024-02-28 o return fmt.Errorf("close message writer: %w", err)
86 71191436 2024-02-28 o }
87 71191436 2024-02-28 o return nil
88 71191436 2024-02-28 o }