128 lines
2.2 KiB
Go
128 lines
2.2 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/base64"
|
||
|
"encoding/json"
|
||
|
"io"
|
||
|
"log"
|
||
|
"os"
|
||
|
|
||
|
"github.com/emersion/go-smtp"
|
||
|
"github.com/rabbitmq/amqp091-go"
|
||
|
)
|
||
|
|
||
|
type Mail struct {
|
||
|
From *string `json:"from"`
|
||
|
To *string `json:"to"`
|
||
|
Body *string `json:"body"`
|
||
|
UTF8 *bool `json:"UTF8"`
|
||
|
}
|
||
|
|
||
|
type backend struct{
|
||
|
Queue *amqp091.Queue
|
||
|
Channel *amqp091.Channel
|
||
|
}
|
||
|
|
||
|
func (bkd *backend) NewSession(c *smtp.Conn) (smtp.Session, error) {
|
||
|
return &session{
|
||
|
Queue: bkd.Queue,
|
||
|
Channel: bkd.Channel,
|
||
|
MailBuilder: Mail{},
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
type session struct{
|
||
|
Queue *amqp091.Queue
|
||
|
MailBuilder Mail
|
||
|
Channel *amqp091.Channel
|
||
|
}
|
||
|
|
||
|
func (s *session) AuthPlain(username, password string) error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *session) Mail(from string, opts *smtp.MailOptions) error {
|
||
|
s.MailBuilder.From = &from
|
||
|
s.MailBuilder.UTF8 = &opts.UTF8
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *session) Rcpt(to string, opts *smtp.RcptOptions) error {
|
||
|
s.MailBuilder.To = &to
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *session) Data(r io.Reader) error {
|
||
|
buf := new(bytes.Buffer)
|
||
|
if _, err := buf.ReadFrom(r); err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
body := base64.StdEncoding.EncodeToString(buf.Bytes())
|
||
|
s.MailBuilder.Body = &body
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (s *session) Reset() {
|
||
|
submitMail(s.MailBuilder, s.Channel, s.Queue)
|
||
|
}
|
||
|
|
||
|
func (s *session) Logout() error {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func submitMail(mail Mail, ch *amqp091.Channel, q *amqp091.Queue) {
|
||
|
mb, err := json.Marshal(mail)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
err = ch.Publish(
|
||
|
"",
|
||
|
q.Name,
|
||
|
false,
|
||
|
false,
|
||
|
amqp091.Publishing{
|
||
|
ContentType: "application/octet-stream",
|
||
|
Body: []byte(base64.StdEncoding.EncodeToString(mb)),
|
||
|
},
|
||
|
)
|
||
|
if err != nil {
|
||
|
log.Println("oh uh")
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
log.Println("Submited mail to rabbitmq")
|
||
|
}
|
||
|
|
||
|
|
||
|
func main() {
|
||
|
conn, err := amqp091.Dial("amqp://d:8o9HGX!CFx!2sg!@dUqN@localhost:5672/")
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
defer conn.Close()
|
||
|
|
||
|
ch, err := conn.Channel()
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
defer ch.Close()
|
||
|
|
||
|
q, err := ch.QueueDeclare("mail", true, false, false, false, nil)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
s := smtp.NewServer(&backend{
|
||
|
Queue: &q,
|
||
|
Channel: ch,
|
||
|
})
|
||
|
|
||
|
s.Addr = "0.0.0.0:8700"
|
||
|
s.AllowInsecureAuth = true
|
||
|
s.Debug = os.Stderr
|
||
|
|
||
|
log.Println("Starting smtp server")
|
||
|
log.Fatal(s.ListenAndServe())
|
||
|
|
||
|
}
|