tgmail/server/server.go
2020-12-05 19:12:05 +01:00

96 lines
1.3 KiB
Go

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))
}