You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.2 KiB
100 lines
2.2 KiB
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
|
|
}
|
|
|
|
|