wip: Initial commit
This commit is contained in:
commit
ab2ddeed87
5 changed files with 189 additions and 0 deletions
3
go.mod
Normal file
3
go.mod
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module tgmail
|
||||||
|
|
||||||
|
go 1.15
|
26
main.go
Normal file
26
main.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"tgmail/server"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
l, err := net.Listen("tcp", "0.0.0.0:2525")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer l.Close()
|
||||||
|
|
||||||
|
log.Println("Listening!")
|
||||||
|
|
||||||
|
for {
|
||||||
|
c, err := l.Accept()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
go server.Handle(c)
|
||||||
|
}
|
||||||
|
}
|
49
server/conn_wrapper.go
Normal file
49
server/conn_wrapper.go
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type wrapper struct {
|
||||||
|
net.Conn
|
||||||
|
r *bufio.Reader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wrapper) cmd(code int64, msgs ...string) error {
|
||||||
|
for i, msg := range msgs {
|
||||||
|
sep := "-"
|
||||||
|
if i == len(msgs)-1 {
|
||||||
|
sep = " "
|
||||||
|
}
|
||||||
|
err := w.send(strconv.FormatInt(code, 10) + sep + msg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wrapper) send(message string) error {
|
||||||
|
log.Println("+", message)
|
||||||
|
// fuck some MTAs
|
||||||
|
_, err := w.Write([]byte(message + "\r\n"))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *wrapper) recv() (string, error) {
|
||||||
|
if w.r == nil {
|
||||||
|
w.r = bufio.NewReader(w)
|
||||||
|
}
|
||||||
|
//log.Println("* recv called")
|
||||||
|
msg, err := w.r.ReadString('\n')
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
msg = strings.TrimRight(msg, " \t\r\n")
|
||||||
|
log.Println("-", msg)
|
||||||
|
return msg, nil
|
||||||
|
}
|
95
server/server.go
Normal file
95
server/server.go
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
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))
|
||||||
|
}
|
16
test.js
Normal file
16
test.js
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
const net = require('net')
|
||||||
|
|
||||||
|
const server = net.createServer(c => {
|
||||||
|
console.log('Connected')
|
||||||
|
c.on('data', d => {
|
||||||
|
console.log('data', d.toString())
|
||||||
|
})
|
||||||
|
c.on('end', () => {
|
||||||
|
console.log('client disconnected')
|
||||||
|
})
|
||||||
|
c.write('220 uwu ESMTP\n')
|
||||||
|
})
|
||||||
|
|
||||||
|
server.listen(2525, () => {
|
||||||
|
console.log('works')
|
||||||
|
})
|
Loading…
Reference in a new issue