codeword/internal/adapters/client/mail.go
2024-01-04 14:32:27 +03:00

88 lines
2.0 KiB
Go

package client
import (
"bytes"
"encoding/base64"
"fmt"
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"mime/multipart"
)
type RecoveryEmailSenderDeps struct {
SmtpApiUrl string
SmtpHost string
SmtpPort string
SmtpSender string
Username string
Password string
ApiKey string
FiberClient *fiber.Client
Logger *zap.Logger
CodewordHost string
CodewordPort string
}
type RecoveryEmailSender struct {
deps RecoveryEmailSenderDeps
}
func NewRecoveryEmailSender(deps RecoveryEmailSenderDeps) *RecoveryEmailSender {
if deps.FiberClient == nil {
deps.FiberClient = fiber.AcquireClient()
}
return &RecoveryEmailSender{
deps: deps,
}
}
func (r *RecoveryEmailSender) SendRecoveryEmail(email string, signature []byte) error {
signatureStr := base64.URLEncoding.EncodeToString(signature)
url := r.deps.SmtpApiUrl
fmt.Println(email, signatureStr)
message := fmt.Sprintf("http://"+r.deps.CodewordHost+":"+r.deps.CodewordPort+"/recover/%s", signatureStr)
form := new(bytes.Buffer)
writer := multipart.NewWriter(form)
defer writer.Close()
fields := map[string]string{
"from": r.deps.SmtpSender,
"to": "pashamullin202@gmail.com",
"subject": "Восстановление доступа",
"html": message,
}
for key, value := range fields {
if err := writer.WriteField(key, value); err != nil {
return err
}
}
if err := writer.Close(); err != nil {
return err
}
req := r.deps.FiberClient.Post(url).Body(form.Bytes()).ContentType(writer.FormDataContentType())
if r.deps.ApiKey != "" {
req.Set("Authorization", r.deps.ApiKey)
}
statusCode, body, errs := req.Bytes()
if errs != nil {
r.deps.Logger.Error("Error sending request", zap.Error(errs[0]))
return errs[0]
}
if statusCode != fiber.StatusOK {
err := fmt.Errorf("the SMTP service returned an error: %s Response body: %s", statusCode, body)
r.deps.Logger.Error("Error sending email", zap.Error(err))
return err
}
//r.deps.Logger.Info("Recovery email sent", zap.String("email", email))
return nil
}