package client import ( "bytes" "fmt" "github.com/gofiber/fiber/v2" "go.uber.org/zap" "mime/multipart" ) type RecoveryEmailSenderDeps struct { ApiUrl string Sender string ApiKey string Logger *zap.Logger RecoveryUrl string } type RecoveryEmailSender struct { apiUrl string sender string apiKey string fiberClient *fiber.Client logger *zap.Logger recoveryUrl string } func NewRecoveryEmailSender(deps RecoveryEmailSenderDeps) *RecoveryEmailSender { return &RecoveryEmailSender{ apiUrl: deps.ApiUrl, sender: deps.Sender, apiKey: deps.ApiKey, fiberClient: fiber.AcquireClient(), logger: deps.Logger, recoveryUrl: deps.RecoveryUrl, } } func (r *RecoveryEmailSender) SendRecoveryEmail(email string, signature string) error { fmt.Println(email, signature) message := fmt.Sprintf(`Здравствуйте, ваша ссылка для восстановление пароля(доступна всего 15 минут) Если это были не вы, напишите пожалуйста в техническую поддержку.`, r.recoveryUrl+signature) form := new(bytes.Buffer) writer := multipart.NewWriter(form) defer writer.Close() fields := map[string]string{ "from": r.sender, "to": email, "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.fiberClient.Post(r.apiUrl).Body(form.Bytes()).ContentType(writer.FormDataContentType()) if r.apiKey != "" { req.Set("Authorization", r.apiKey) } statusCode, body, errs := req.Bytes() if errs != nil { r.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.logger.Error("Error sending email", zap.Error(err)) return err } //r.deps.Logger.Info("Recovery email sent", zap.String("email", email)) return nil }