96 lines
1.3 KiB
Go
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))
|
|
}
|