commit a6af3d11e25c6b281fc4592948f71d750cb20761 Author: Mitchell Date: Thu Feb 1 12:01:05 2018 -0600 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c747cbd --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +vendor +*.db +tmail diff --git a/Gopkg.lock b/Gopkg.lock new file mode 100644 index 0000000..3f374bb --- /dev/null +++ b/Gopkg.lock @@ -0,0 +1,101 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/asdine/storm" + packages = [ + ".", + "codec", + "codec/json", + "index", + "internal", + "q" + ] + revision = "68fc73b635f890fe7ba2f3b15ce80c85b28a744f" + version = "v2.0.2" + +[[projects]] + name = "github.com/coreos/bbolt" + packages = ["."] + revision = "583e8937c61f1af6513608ccc75c97b6abdf4ff9" + version = "v1.3.0" + +[[projects]] + branch = "master" + name = "github.com/gin-contrib/sse" + packages = ["."] + revision = "22d885f9ecc78bf4ee5d72b937e4bbcdc58e8cae" + +[[projects]] + name = "github.com/gin-gonic/gin" + packages = [ + ".", + "binding", + "render" + ] + revision = "d459835d2b077e44f7c9b453505ee29881d5d12d" + version = "v1.2" + +[[projects]] + name = "github.com/golang/protobuf" + packages = ["proto"] + revision = "925541529c1fa6821df4e44ce2723319eb2be768" + version = "v1.0.0" + +[[projects]] + name = "github.com/mattn/go-isatty" + packages = ["."] + revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" + version = "v0.0.3" + +[[projects]] + branch = "master" + name = "github.com/mhale/smtpd" + packages = ["."] + revision = "1f9c0adefd94a30cab2ffcc25587b90a6b7a50c1" + +[[projects]] + name = "github.com/sirupsen/logrus" + packages = ["."] + revision = "d682213848ed68c0a260ca37d6dd5ace8423f5ba" + version = "v1.0.4" + +[[projects]] + name = "github.com/ugorji/go" + packages = ["codec"] + revision = "9831f2c3ac1068a78f50999a30db84270f647af6" + version = "v1.1" + +[[projects]] + branch = "master" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + revision = "1875d0a70c90e57f11972aefd42276df65e895b9" + +[[projects]] + branch = "master" + name = "golang.org/x/sys" + packages = [ + "unix", + "windows" + ] + revision = "8f27ce8a604014414f8dfffc25cbcde83a3f2216" + +[[projects]] + name = "gopkg.in/go-playground/validator.v8" + packages = ["."] + revision = "5f1438d3fca68893a817e4a66806cea46a9e4ebf" + version = "v8.18.2" + +[[projects]] + branch = "v2" + name = "gopkg.in/yaml.v2" + packages = ["."] + revision = "d670f9405373e636a5a2765eea47fac0c9bc91a4" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "466f07b37f7df05f3425d1710259c615b219c5ebb3bd49dfaa4a1d5520a3804c" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml new file mode 100644 index 0000000..9d9fcee --- /dev/null +++ b/Gopkg.toml @@ -0,0 +1,34 @@ +# Gopkg.toml example +# +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + + +[[constraint]] + branch = "master" + name = "github.com/mhale/smtpd" + +[prune] + go-tests = true + unused-packages = true diff --git a/db/db.go b/db/db.go new file mode 100644 index 0000000..329f2ed --- /dev/null +++ b/db/db.go @@ -0,0 +1,20 @@ +package db + +import ( + "log" + + "github.com/asdine/storm" +) + +var Conn *storm.DB + +func Init() { + + var err error + Conn, err = storm.Open("mail.db") + + if err != nil { + log.Fatal(err) + } + +} diff --git a/mail/mail.go b/mail/mail.go new file mode 100644 index 0000000..fface0a --- /dev/null +++ b/mail/mail.go @@ -0,0 +1,22 @@ +package mail + +import ( + "github.com/mgerb/tmail/db" + log "github.com/sirupsen/logrus" +) + +type Mail struct { + ID int `storm:"increment" json:"id"` + From string `json:"from"` + To string `storm:"index" json:"to"` + Subject string `json:"subject"` + Content string `json:"content"` +} + +func (m *Mail) Save() { + err := db.Conn.Save(m) + + if err != nil { + log.Error(err) + } +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..c65aa0d --- /dev/null +++ b/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "os" + + "github.com/asdine/storm" + "github.com/mgerb/tmail/db" + "github.com/mgerb/tmail/smtpserver" + "github.com/mgerb/tmail/webserver" + log "github.com/sirupsen/logrus" +) + +//DB - database instance +var DB *storm.DB + +func init() { + // Log as JSON instead of the default ASCII formatter. + log.SetFormatter(&log.JSONFormatter{}) + + // Output to stdout instead of the default stderr + // Can be any io.Writer, see below for File example + log.SetOutput(os.Stdout) + + // Only log the warning severity or above. + log.SetLevel(log.DebugLevel) +} + +func main() { + db.Init() + defer db.Conn.Close() + + // start webserver + go webserver.Start() + + // start smtp server + smtpserver.Start() +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..91b93c4 --- /dev/null +++ b/readme.md @@ -0,0 +1,12 @@ +# TMail +A throwaway smtp mail server. + + +## Check email +``` +All mail: +http://host:8090/api/mail + +Specific mail: +http://host:8090/api/mail?to=
+``` diff --git a/smtpserver/smtpserver.go b/smtpserver/smtpserver.go new file mode 100644 index 0000000..f8f4cc4 --- /dev/null +++ b/smtpserver/smtpserver.go @@ -0,0 +1,35 @@ +package smtpserver + +import ( + "bytes" + "net" + "net/mail" + + mymail "github.com/mgerb/tmail/mail" + "github.com/mhale/smtpd" + log "github.com/sirupsen/logrus" +) + +func Start() { + log.Error(smtpd.ListenAndServe("0.0.0.0:25", mailHandler, "tmail", "")) +} + +func mailHandler(origin net.Addr, from string, to []string, data []byte) { + msg, err := mail.ReadMessage(bytes.NewReader(data)) + + if err != nil { + log.Error(err) + return + } + + subject := msg.Header.Get("Subject") + + m := &mymail.Mail{ + Content: string(data), + From: from, + To: to[0], + Subject: subject, + } + + m.Save() +} diff --git a/webserver/webserver.go b/webserver/webserver.go new file mode 100644 index 0000000..9efca7c --- /dev/null +++ b/webserver/webserver.go @@ -0,0 +1,30 @@ +package webserver + +import ( + "log" + + "github.com/gin-gonic/gin" + "github.com/mgerb/tmail/db" + "github.com/mgerb/tmail/mail" +) + +func Start() { + r := gin.Default() + r.GET("/api/mail", mailHander) + r.Run("0.0.0.0:8090") +} + +func mailHander(c *gin.Context) { + + to := c.Query("to") + var mail []mail.Mail + log.Println(to) + + if to != "" { + db.Conn.Find("To", to, &mail) + } else { + db.Conn.All(&mail) + } + + c.JSON(200, mail) +}