github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/syz-cluster/pkg/emailclient/sender.go (about) 1 // Copyright 2025 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package emailclient 5 6 import ( 7 "context" 8 "fmt" 9 10 "github.com/google/syzkaller/syz-cluster/pkg/app" 11 ) 12 13 type Email struct { 14 To []string 15 Cc []string 16 Subject string 17 InReplyTo string 18 Body []byte 19 BugID string // In case it's to be included into Sender. 20 } 21 22 func (item *Email) recipients() []string { 23 var ret []string 24 ret = append(ret, item.To...) 25 ret = append(ret, item.Cc...) 26 return unique(ret) 27 } 28 29 type Sender func(context.Context, *Email) (string, error) 30 31 func MakeSender(ctx context.Context, cfg *app.EmailConfig) (Sender, error) { 32 switch cfg.Sender { 33 case app.SenderSMTP: 34 sender, err := newSMTPSender(ctx, cfg) 35 if err != nil { 36 return nil, err 37 } 38 return sender.Send, nil 39 case app.SenderDashapi: 40 return makeDashapiSender(cfg) 41 } 42 return nil, fmt.Errorf("unsupported sender type: %q", cfg.Sender) 43 } 44 45 func unique(list []string) []string { 46 var ret []string 47 seen := map[string]struct{}{} 48 for _, str := range list { 49 if _, ok := seen[str]; ok { 50 continue 51 } 52 seen[str] = struct{}{} 53 ret = append(ret, str) 54 } 55 return ret 56 } 57 58 func TestEmailConfig() *app.EmailConfig { 59 return &app.EmailConfig{ 60 Name: "name", 61 DocsLink: "docs", 62 ModerationList: "moderation@list.com", 63 ReportCC: []string{"reported@list.com"}, 64 ArchiveList: "archive@list.com", 65 Sender: app.SenderSMTP, 66 SMTP: &app.SMTPConfig{ 67 From: "a@b.com", 68 }, 69 } 70 }