package server import ( "bytes" "io/ioutil" "log" "net" "net/mail" "strings" ) const response = "uwu" func Handle(conn net.Conn) { c := wrapper{Conn: conn} log.Println("Connection received from", c.RemoteAddr().String()) c.cmd(220, response+" ESMTP") for { msg, err := c.recv() if err != nil { log.Println(err) c.Close() return } cmd := strings.ToUpper(strings.Split(msg, " ")[0]) if cmd == "EHLO" { c.cmd(250, response, "8BITMIME", "SMTPUTF8", "SIZE 104857600") continue } if cmd == "DATA" { c.cmd(354, response) data, err := readContent(c) if err != nil { log.Println(err) c.Close() return } go handleMessage(data) continue } if cmd == "QUIT" { c.cmd(221, response) c.Close() break } c.cmd(250, response) } c.Close() } func readContent(c wrapper) (string, error) { data := "" for { msg, err := c.recv() if err != nil { return "", err } if msg == "." { break } data += msg + "\r\n" } c.cmd(250, response) return data, nil } func handleMessage(data string) { msg, err := mail.ReadMessage(bytes.NewReader([]byte(data))) if err != nil { log.Println(err) return } body, err := ioutil.ReadAll(msg.Body) if err != nil { log.Println(err) return } log.Println("FROM: ", msg.Header.Get("From")) log.Println(string(body)) }