forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package email
2
3import (
4 "fmt"
5 "net"
6 "net/mail"
7 "strings"
8
9 "github.com/resend/resend-go/v2"
10)
11
12type Email struct {
13 From string
14 To string
15 Subject string
16 Text string
17 Html string
18 APIKey string
19}
20
21func SendEmail(email Email) error {
22 client := resend.NewClient(email.APIKey)
23 _, err := client.Emails.Send(&resend.SendEmailRequest{
24 From: email.From,
25 To: []string{email.To},
26 Subject: email.Subject,
27 Text: email.Text,
28 Html: email.Html,
29 })
30 if err != nil {
31 return fmt.Errorf("error sending email: %w", err)
32 }
33 return nil
34}
35
36func IsValidEmail(email string) bool {
37 // Reject whitespace (ParseAddress normalizes it away)
38 if strings.ContainsAny(email, " \t\n\r") {
39 return false
40 }
41
42 // Use stdlib RFC 5322 parser
43 addr, err := mail.ParseAddress(email)
44 if err != nil {
45 return false
46 }
47
48 // Split email into local and domain parts
49 parts := strings.Split(addr.Address, "@")
50 domain := parts[1]
51
52 mx, err := net.LookupMX(domain)
53 if err != nil || len(mx) == 0 {
54 return false
55 }
56
57 return true
58}