codeword/internal/adapters/client/mail.go

86 lines
2.1 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
}
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("https://hub.pena.digital/codeword/restore/%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("Ошибка при отправке запроса", zap.Error(errs[0]))
return errs[0]
}
if statusCode != fiber.StatusOK {
err := fmt.Errorf("SMTP сервис вернул ошибку: %s Тело ответа: %s", statusCode, body)
r.deps.Logger.Error("Ошибка при отправке электронной почты", zap.Error(err))
return err
}
r.deps.Logger.Info("Письмо для восстановления отправлено", zap.String("email", email))
return nil
}