package main // import "github.com/productionwentdown/email-collector" import ( "encoding/csv" "flag" "log" "net/http" "os" "sync" "time" // modified from @badoux's checkmail "github.com/productionwentdown/email-collector/checkmail" ) var filename string var listen string var redirect string func main() { flag.StringVar(&filename, "file", "list.csv", "file to append records to") flag.StringVar(&listen, "listen", ":8080", "address to listen to") flag.StringVar(&redirect, "redirect", "/subscribed", "path to redirect to upon success") flag.Parse() csvMutex := &sync.Mutex{} csvFile, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) defer csvFile.Close() if err != nil { log.Fatal(err) } csvWriter := csv.NewWriter(csvFile) http.HandleFunc("/subscribe", func(w http.ResponseWriter, r *http.Request) { err := r.ParseForm() if err != nil { log.Println(err) w.WriteHeader(400) w.Write([]byte("An error occurred. Please try again")) return } email := r.Form.Get("email") if err := checkmail.ValidateFormat(email); err != nil { log.Println(email, err) w.WriteHeader(400) w.Write([]byte("Email is not valid")) return } err = checkmail.ValidateHost(email) if _, ok := err.(checkmail.SmtpError); !ok && err != nil { log.Println(email, err) w.WriteHeader(400) w.Write([]byte("Email is not valid")) return } log.Println(email, "success") csvMutex.Lock() csvWriter.Write([]string{email, time.Now().String()}) csvWriter.Flush() csvMutex.Unlock() w.Header().Add("Location", redirect) w.WriteHeader(303) }) log.Fatal(http.ListenAndServe(listen, nil)) }