1
0
Fork 0
email-collector/email-collector.go

59 lines
1.3 KiB
Go

package main // import "github.com/productionwentdown/email-collector"
import (
"encoding/csv"
"log"
"net/http"
"os"
"sync"
"time"
// modified from @badoux's checkmail
"github.com/productionwentdown/email-collector/checkmail"
)
func main() {
csvMutex := &sync.Mutex{}
csvFile, err := os.OpenFile("list.csv", 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", "/subscribed")
w.WriteHeader(303)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}