parent
94e0970fd3
commit
5c07583ba4
@ -0,0 +1,100 @@ |
||||
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 |
||||
} |
||||
|
||||
@ -0,0 +1,35 @@ |
||||
package common_email |
||||
|
||||
import ( |
||||
"github.com/redis/go-redis/v9" |
||||
"github.com/wneessen/go-mail" |
||||
"context" |
||||
) |
||||
|
||||
type Config struct { |
||||
RedisHostPort string |
||||
RedisPassword string |
||||
RedisDB int |
||||
SMTPHost string |
||||
SMTPPort int |
||||
} |
||||
|
||||
type EmailMessage struct { |
||||
To string |
||||
From string |
||||
Subject string |
||||
Text string |
||||
HTML string |
||||
} |
||||
|
||||
type Sender struct { |
||||
redis_client *redis.Client |
||||
ctx context.Context |
||||
} |
||||
|
||||
type Router struct { |
||||
redis_client *redis.Client |
||||
smtp_client *mail.Client |
||||
ctx context.Context |
||||
} |
||||
|
||||
@ -0,0 +1,3 @@ |
||||
<h1>email</h1> |
||||
|
||||
<p>Replace me.</p> |
||||
Loading…
Reference in new issue