iomail/smtp/main.go
2024-05-21 06:50:03 +02:00

127 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())
}