codeword/internal/adapters/client/mail.go

87 lines
2.1 KiB
Go
Raw Permalink 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"
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 {
2025-01-02 10:44:52 +00:00
ApiUrl string
Sender string
2024-01-18 22:01:15 +00:00
ApiKey string
Logger *zap.Logger
RecoveryUrl string
2024-01-03 13:50:11 +00:00
}
2023-12-31 12:22:03 +00:00
type RecoveryEmailSender struct {
2025-01-02 10:44:52 +00:00
apiUrl string
sender string
apiKey string
fiberClient *fiber.Client
logger *zap.Logger
recoveryUrl string
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 {
return &RecoveryEmailSender{
2025-01-02 10:44:52 +00:00
apiUrl: deps.ApiUrl,
sender: deps.Sender,
apiKey: deps.ApiKey,
fiberClient: fiber.AcquireClient(),
logger: deps.Logger,
recoveryUrl: deps.RecoveryUrl,
2024-01-03 13:50:11 +00:00
}
}
2024-01-07 11:13:07 +00:00
func (r *RecoveryEmailSender) SendRecoveryEmail(email string, signature string) error {
fmt.Println(email, signature)
2024-01-03 13:50:11 +00:00
2024-01-18 22:01:15 +00:00
message := fmt.Sprintf(`Здравствуйте, ваша <a href="%s">ссылка для восстановление пароля</a>(доступна всего 15 минут)
2025-03-23 21:51:36 +00:00
Если это были не вы, напишите пожалуйста в техническую поддержку.`, signature)
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{
2025-01-02 10:44:52 +00:00
"from": r.sender,
2024-01-18 13:44:55 +00:00
"to": email,
2024-01-03 13:50:11 +00:00
"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
2025-01-02 10:44:52 +00:00
req := r.fiberClient.Post(r.apiUrl).Body(form.Bytes()).ContentType(writer.FormDataContentType())
if r.apiKey != "" {
req.Set("Authorization", r.apiKey)
2024-01-03 13:50:11 +00:00
}
statusCode, body, errs := req.Bytes()
if errs != nil {
2025-01-02 10:44:52 +00:00
r.logger.Error("Error sending request", zap.Error(errs[0]))
2024-01-03 13:50:11 +00:00
return errs[0]
}
if statusCode != fiber.StatusOK {
2024-01-04 11:27:50 +00:00
err := fmt.Errorf("the SMTP service returned an error: %s Response body: %s", statusCode, body)
2025-01-02 10:44:52 +00:00
r.logger.Error("Error sending email", zap.Error(err))
2024-01-03 13:50:11 +00:00
return err
}
2023-12-29 11:30:20 +00:00
2024-01-04 11:27:50 +00:00
//r.deps.Logger.Info("Recovery email sent", zap.String("email", email))
2023-12-29 11:30:20 +00:00
return nil
}