codeword/internal/adapters/client/mail.go

86 lines
2.1 KiB
Go
Raw Normal View History

2023-12-29 11:30:20 +00:00
package client
2023-12-31 12:22:03 +00:00
import (
2024-01-03 13:50:11 +00:00
"bytes"
"encoding/base64"
2023-12-31 12:22:03 +00:00
"fmt"
2024-01-03 13:50:11 +00:00
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"mime/multipart"
2023-12-31 12:22:03 +00:00
)
2023-12-29 11:30:20 +00:00
2024-01-03 13:50:11 +00:00
type RecoveryEmailSenderDeps struct {
SmtpApiUrl string
SmtpHost string
SmtpPort string
SmtpSender string
Username string
Password string
ApiKey string
FiberClient *fiber.Client
Logger *zap.Logger
}
2023-12-31 12:22:03 +00:00
type RecoveryEmailSender struct {
2024-01-03 13:50:11 +00:00
deps RecoveryEmailSenderDeps
2023-12-31 12:22:03 +00:00
}
2023-12-29 11:30:20 +00:00
2024-01-03 13:50:11 +00:00
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)
2024-01-03 13:50:11 +00:00
url := r.deps.SmtpApiUrl
fmt.Println(email, signatureStr)
2024-01-03 13:50:11 +00:00
message := fmt.Sprintf("https://hub.pena.digital/codeword/restore/%s", signatureStr)
2023-12-31 12:22:03 +00:00
2024-01-03 13:50:11 +00:00
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
}
}
2023-12-31 12:22:03 +00:00
2024-01-03 13:50:11 +00:00
if err := writer.Close(); err != nil {
2023-12-31 12:22:03 +00:00
return err
}
2023-12-29 11:30:20 +00:00
2024-01-03 13:50:11 +00:00
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
}
2023-12-29 11:30:20 +00:00
2024-01-03 13:50:11 +00:00
r.deps.Logger.Info("Письмо для восстановления отправлено", zap.String("email", email))
2023-12-29 11:30:20 +00:00
return nil
}