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 CodewordHost string CodewordPort 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 []byte) error { signatureStr := base64.URLEncoding.EncodeToString(signature) url := r.deps.SmtpApiUrl fmt.Println(email, signatureStr) message := fmt.Sprintf("http://"+r.deps.CodewordHost+":"+r.deps.CodewordPort+"/recover/%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("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("Ошибка при отправке электронной почты", zap.Error(err)) return err } //r.deps.Logger.Info("Recovery email sent", zap.String("email", email)) return nil }