package main import ( "encoding/csv" "fmt" "log" "os" "strings" ) func NewValidator(domains []string, usersFile string) func(string) bool { validUsers := make(map[string]bool) if usersFile != "" { log.Printf("using authenticated emails file %s", usersFile) r, err := os.Open(usersFile) if err != nil { log.Fatalf("failed opening authenticated-emails-file=%q, %s", usersFile, err) } csv_reader := csv.NewReader(r) csv_reader.Comma = ',' csv_reader.Comment = '#' csv_reader.TrimLeadingSpace = true records, err := csv_reader.ReadAll() for _, r := range records { validUsers[r[0]] = true } } validator := func(email string) bool { valid := false for _, domain := range domains { emailSuffix := fmt.Sprintf("@%s", domain) valid = valid || strings.HasSuffix(email, emailSuffix) } if !valid { _, valid = validUsers[email] } log.Printf("validating: is %s valid? %v", email, valid) return valid } return validator }