package client import ( "bytes" "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 RecoveryUrl 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 string) error { url := r.deps.SmtpApiUrl fmt.Println(email, signature) message := fmt.Sprintf(`Здравствуйте, ваша ссылка для восстановление пароля(доступна всего 15 минут) Если это были не вы, напишите пожалуйста в техническую поддержку.`, r.deps.RecoveryUrl + signature) form := new(bytes.Buffer) writer := multipart.NewWriter(form) defer writer.Close() fields := map[string]string{ "from": r.deps.SmtpSender, "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.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 }