Compare commits

..

No commits in common. "b5f2e37ff896b50296e7f227e18dc6f66370d79e" and "f3d8e7052ff9cd6b615c318285f7cc8108a662d7" have entirely different histories.

6 changed files with 29 additions and 57 deletions

View File

@ -1,4 +1,4 @@
FROM golang:1.23 as build FROM golang:1.22 as build
RUN apt-get update && apt-get upgrade -y RUN apt-get update && apt-get upgrade -y
RUN apt-get install make sqlite3 -y RUN apt-get install make sqlite3 -y

8
go.mod
View File

@ -1,11 +1,9 @@
module github.com/GRFreire/nthmail module github.com/GRFreire/nthmail
go 1.23.0 go 1.21.6
toolchain go1.23.5
require ( require (
github.com/a-h/templ v0.3.943 // indirect github.com/a-h/templ v0.2.747 // indirect
github.com/aymerick/douceur v0.2.0 // indirect github.com/aymerick/douceur v0.2.0 // indirect
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 // indirect github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 // indirect
github.com/emersion/go-smtp v0.20.2 // indirect github.com/emersion/go-smtp v0.20.2 // indirect
@ -14,5 +12,5 @@ require (
github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/mattn/go-sqlite3 v1.14.22 // indirect
github.com/microcosm-cc/bluemonday v1.0.27 // indirect github.com/microcosm-cc/bluemonday v1.0.27 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect
golang.org/x/net v0.42.0 // indirect golang.org/x/net v0.33.0 // indirect
) )

4
go.sum
View File

@ -4,8 +4,6 @@ github.com/a-h/templ v0.2.598 h1:6jMIHv6wQZvdPxTuv87erW4RqN/FPU0wk7ZHN5wVuuo=
github.com/a-h/templ v0.2.598/go.mod h1:SA7mtYwVEajbIXFRh3vKdYm/4FYyLQAtPH1+KxzGPA8= github.com/a-h/templ v0.2.598/go.mod h1:SA7mtYwVEajbIXFRh3vKdYm/4FYyLQAtPH1+KxzGPA8=
github.com/a-h/templ v0.2.747 h1:D0dQ2lxC3W7Dxl6fxQ/1zZHBQslSkTSvl5FxP/CfdKg= github.com/a-h/templ v0.2.747 h1:D0dQ2lxC3W7Dxl6fxQ/1zZHBQslSkTSvl5FxP/CfdKg=
github.com/a-h/templ v0.2.747/go.mod h1:69ObQIbrcuwPCU32ohNaWce3Cb7qM5GMiqN1K+2yop4= github.com/a-h/templ v0.2.747/go.mod h1:69ObQIbrcuwPCU32ohNaWce3Cb7qM5GMiqN1K+2yop4=
github.com/a-h/templ v0.3.943 h1:o+mT/4yqhZ33F3ootBiHwaY4HM5EVaOJfIshvd5UNTY=
github.com/a-h/templ v0.3.943/go.mod h1:oCZcnKRf5jjsGpf2yELzQfodLphd2mwecwG4Crk5HBo=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 h1:OJyUGMJTzHTd1XQp98QTaHernxMYzRaOasRir9hUlFQ= github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 h1:OJyUGMJTzHTd1XQp98QTaHernxMYzRaOasRir9hUlFQ=
@ -30,5 +28,3 @@ golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=

View File

@ -40,13 +40,13 @@ type Session struct {
domain string domain string
} }
func append_addrs_with_domain(addrs []string, domain string, with_domain *[]string) { func get_addr_domain(addr string) string {
for _, a := range addrs { index := strings.Index(addr, "@")
index := strings.Index(a, "@") if index < 0 {
if index > 0 && a[index+1:] == domain { return ""
*with_domain = append(*with_domain, a)
}
} }
return addr[index+1:]
} }
func (session *Session) AuthPlain(username, password string) error { func (session *Session) AuthPlain(username, password string) error {
@ -61,6 +61,9 @@ func (session *Session) Mail(from string, opts *smtp.MailOptions) error {
} }
func (session *Session) Rcpt(to string, opts *smtp.RcptOptions) error { func (session *Session) Rcpt(to string, opts *smtp.RcptOptions) error {
if get_addr_domain(to) != session.domain {
return errors.New("To addr domain is not available in this server")
}
session.rcpt = to session.rcpt = to
return nil return nil
@ -79,16 +82,10 @@ func (session *Session) Data(reader io.Reader) error {
return err return err
} }
var addrs []string if get_addr_domain(mail_obj.To) != session.domain {
append_addrs_with_domain(mail_obj.To, session.domain, &addrs) return errors.New("To addr domain is not available in this server")
append_addrs_with_domain(mail_obj.Cc, session.domain, &addrs)
append_addrs_with_domain(mail_obj.Bcc, session.domain, &addrs)
if len(addrs) <= 0 {
return errors.New("Not a single addr from to, cc and cc has the domain available in this server")
} }
for _, addr := range addrs {
stmt, err := session.tx.Prepare("INSERT INTO mails (arrived_at, rcpt_addr, from_addr, subject, data) VALUES (?, ?, ?, ?, ?)") stmt, err := session.tx.Prepare("INSERT INTO mails (arrived_at, rcpt_addr, from_addr, subject, data) VALUES (?, ?, ?, ?, ?)")
if err != nil { if err != nil {
println(err) println(err)
@ -96,13 +93,11 @@ func (session *Session) Data(reader io.Reader) error {
} }
defer stmt.Close() defer stmt.Close()
_, err = stmt.Exec(session.arrived_at, addr, mail_obj.From, mail_obj.Subject, bytes) _, err = stmt.Exec(session.arrived_at, session.rcpt, mail_obj.From, mail_obj.Subject, bytes)
if err != nil { if err != nil {
return err return err
} }
}
err = session.tx.Commit() err = session.tx.Commit()
if err != nil { if err != nil {
return err return err

View File

@ -38,9 +38,8 @@ type Mail_obj struct {
Id int Id int
From string From string
Date time.Time Date time.Time
To []string To string
Cc []string Bcc string
Bcc []string
Subject string Subject string
Body []Mail_body Body []Mail_body
@ -80,26 +79,10 @@ func Parse_mail(m_data []byte, header_only bool) (Mail_obj, error) {
// HEADERS // HEADERS
dec := new(mime.WordDecoder) dec := new(mime.WordDecoder)
m.From, _ = dec.DecodeHeader(mail_msg.Header.Get("From")) m.From, _ = dec.DecodeHeader(mail_msg.Header.Get("From"))
m.To, _ = dec.DecodeHeader(mail_msg.Header.Get("To"))
m.Bcc, _ = dec.DecodeHeader(mail_msg.Header.Get("Bcc"))
m.Subject, _ = dec.DecodeHeader(mail_msg.Header.Get("Subject")) m.Subject, _ = dec.DecodeHeader(mail_msg.Header.Get("Subject"))
to_addrs, _ := mail_msg.Header.AddressList("To")
m.To = make([]string, len(to_addrs))
for i, a := range to_addrs {
m.To[i] = a.Address
}
cc_addrs, _ := mail_msg.Header.AddressList("Cc")
m.Cc = make([]string, len(to_addrs))
for i, a := range cc_addrs {
m.Cc[i] = a.Address
}
bcc_addrs, _ := mail_msg.Header.AddressList("Bcc")
m.Bcc = make([]string, len(to_addrs))
for i, a := range bcc_addrs {
m.Bcc[i] = a.Address
}
if header_only { if header_only {
return m, nil return m, nil
} }

View File

@ -159,7 +159,7 @@ func (sr ServerResouces) handleInbox(res http.ResponseWriter, req *http.Request)
var mail_obj mail_utils.Mail_obj var mail_obj mail_utils.Mail_obj
mail_obj.Id = m.Id mail_obj.Id = m.Id
mail_obj.Date = time.Unix(m.Arrived_at, 0) mail_obj.Date = time.Unix(m.Arrived_at, 0)
mail_obj.To = []string{m.Rcpt_addr} mail_obj.To = m.Rcpt_addr
mail_obj.From = m.From_addr mail_obj.From = m.From_addr
mail_obj.Subject = m.Subject mail_obj.Subject = m.Subject