package common_email import ( "github.com/wneessen/go-mail" "encoding/json" "context" "github.com/redis/go-redis/v9" ) func NewSender(ctx context.Context, config Config) (Sender){ client := redis.NewClient(&redis.Options{ Addr: config.RedisHostPort, Password: config.RedisPassword, DB: config.RedisDB, }) return Sender{client, ctx} } func NewRouter(ctx context.Context, config Config) (Router, error) { var router Router var err error router.ctx = ctx router.redis_client = redis.NewClient(&redis.Options{ Addr: config.RedisHostPort, Password: config.RedisPassword, DB: config.RedisDB, }) router.smtp_client, err = mail.NewClient(config.SMTPHost, mail.WithPort(config.SMTPPort), mail.WithTLSPolicy(mail.NoTLS)) return router, err } func (router *Router) Close() { router.redis_client.Close() router.smtp_client.Close() } func (sender *Sender) Close() { sender.redis_client.Close() } func (router *Router) DeliverEmail(msg EmailMessage) error { email_msg := mail.NewMsg() err := email_msg.From(msg.From) if err != nil { return err } err = email_msg.To(msg.To) if err != nil { return err } email_msg.Subject(msg.Subject) email_msg.SetBodyString(mail.TypeTextPlain, msg.Text) email_msg.SetBodyString(mail.TypeTextHTML, msg.HTML) if err != nil { return err } err = router.smtp_client.DialAndSendWithContext(router.ctx, email_msg) if err != nil { return err } return nil } func (router *Router) ReceiveEmail() (EmailMessage, error) { var msg EmailMessage result, err := router.redis_client.BRPop(router.ctx, 0, "queue").Result() if err != nil { return msg, err } // NOTE: 0=queue name, 1=message err = json.Unmarshal([]byte(result[1]), &msg) if err != nil { return msg, err } return msg, nil } func (router *Router) HandleEmailRequest() error { msg, err := router.ReceiveEmail() if err != nil { return err } err = router.DeliverEmail(msg) if err != nil { return err } return nil } func (sender *Sender) QueueEmail(msg EmailMessage) error { msg_json, err := json.Marshal(msg) if err != nil { return err } _, err = sender.redis_client.LPush(sender.ctx, "queue", string(msg_json)).Result() if err != nil { return err } return nil }