Push email

This commit is contained in:
LittleSheep 2024-10-26 23:01:40 +08:00
parent 7597bff972
commit 478d18d75f
8 changed files with 118 additions and 6 deletions

1
go.mod
View File

@ -8,6 +8,7 @@ require (
github.com/fatih/color v1.17.0
github.com/go-playground/validator/v10 v10.22.1
github.com/goccy/go-json v0.10.3
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible
github.com/nats-io/nats.go v1.37.0
github.com/robfig/cron/v3 v3.0.1
github.com/rs/zerolog v1.33.0

2
go.sum
View File

@ -175,6 +175,8 @@ github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR
github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=
github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=
github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible h1:jdpOPRN1zP63Td1hDQbZW73xKmzDvZHzVdNYxhnTMDA=
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible/go.mod h1:1c7szIrayyPPB/987hsnvNzLushdWf4o/79s3P08L8A=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=

View File

@ -26,11 +26,15 @@ func (v *Server) PushNotificationBatch(ctx context.Context, request *proto.PushN
}
func (v *Server) DeliverEmail(ctx context.Context, request *proto.DeliverEmailRequest) (*proto.DeliveryResponse, error) {
//TODO implement me
panic("implement me")
go provider.SendMail(request.GetTo(), pushkit.NewEmailDataFromProto(request.GetEmail()))
return &proto.DeliveryResponse{IsSuccess: true}, nil
}
func (v *Server) DeliverEmailBatch(ctx context.Context, request *proto.DeliverEmailBatchRequest) (*proto.DeliveryResponse, error) {
//TODO implement me
panic("implement me")
go func() {
for _, to := range request.GetTo() {
_ = provider.SendMail(to, pushkit.NewEmailDataFromProto(request.GetEmail()))
}
}()
return &proto.DeliveryResponse{IsSuccess: true}, nil
}

View File

@ -39,7 +39,7 @@ func (v *AppleNotifyProvider) Push(in pushkit.Notification, tk string) error {
Topic: viper.GetString(v.topic),
Payload: rawData,
}
_, err := v.conn.Push(payload)
_, err = v.conn.Push(payload)
return err
}

View File

@ -0,0 +1,36 @@
package provider
import (
"crypto/tls"
"fmt"
"git.solsynth.dev/hypernet/pusher/pkg/pushkit"
"github.com/jordan-wright/email"
"github.com/spf13/viper"
"net/smtp"
"net/textproto"
)
func SendMail(target string, in pushkit.EmailData) error {
mail := &email.Email{
To: []string{target},
From: viper.GetString("mailer.name"),
Subject: in.Subject,
Headers: textproto.MIMEHeader{},
}
if in.Text != nil {
mail.Text = []byte(*in.Text)
}
if in.HTML != nil {
mail.HTML = []byte(*in.HTML)
}
return mail.SendWithTLS(
fmt.Sprintf("%s:%d", viper.GetString("mailer.smtp_host"), viper.GetInt("mailer.smtp_port")),
smtp.PlainAuth(
"",
viper.GetString("mailer.username"),
viper.GetString("mailer.password"),
viper.GetString("mailer.smtp_host"),
),
&tls.Config{ServerName: viper.GetString("mailer.smtp_host")},
)
}

View File

@ -47,5 +47,37 @@ func SubscribeToQueue() error {
return fmt.Errorf("failed to subscribe notification batch topic: %v", err)
}
_, err = mq.Nt.Subscribe(pushkit.PushEmailMqTopic, func(msg *nats.Msg) {
var req pushkit.EmailDeliverRequest
if json.Unmarshal(msg.Data, &req) != nil {
return
} else if validate.Struct(&req) != nil {
return
}
go provider.SendMail(req.To, req.Email)
})
if err != nil {
return fmt.Errorf("failed to subscribe email topic: %v", err)
}
_, err = mq.Nt.Subscribe(pushkit.PushEmailBatchMqTopic, func(msg *nats.Msg) {
var req pushkit.EmailDeliverBatchRequest
if json.Unmarshal(msg.Data, &req) != nil {
return
} else if validate.Struct(&req) != nil {
return
}
go func() {
for _, to := range req.To {
_ = provider.SendMail(to, req.Email)
}
}()
})
if err != nil {
return fmt.Errorf("failed to subscribe email batch topic: %v", err)
}
return nil
}

30
pkg/pushkit/email.go Normal file
View File

@ -0,0 +1,30 @@
package pushkit
import (
"git.solsynth.dev/hypernet/pusher/pkg/proto"
"github.com/samber/lo"
)
type EmailDeliverRequest struct {
To string `json:"to" validate:"required"`
Email EmailData `json:"email" validate:"required"`
}
type EmailDeliverBatchRequest struct {
To []string `json:"to" validate:"required"`
Email EmailData `json:"email" validate:"required"`
}
type EmailData struct {
Subject string `json:"subject" validate:"required"`
Text *string `json:"text"`
HTML *string `json:"html"`
}
func NewEmailDataFromProto(in *proto.EmailInfo) EmailData {
return EmailData{
Subject: in.GetSubject(),
Text: lo.ToPtr(in.GetTextBody()),
HTML: lo.ToPtr(in.GetHtmlBody()),
}
}

View File

@ -6,4 +6,11 @@ nexus_addr = "127.0.0.1:7001"
[debug]
database = false
print_routes = false
print_routes = false
[mailer]
name = "Alphabot <alphabot@smartsheep.studio>"
smtp_host = "smtp.exmail.qq.com"
smtp_port = 465
username = "alphabot@smartsheep.studio"
password = "gz937Zxxzfcd9SeH"