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