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