package service import ( "bytes" "encoding/json" "fmt" "net/http" ) type EmailService struct { apiKey string fromEmail string fromName string baseURL string } type ResendRequest struct { From string `json:"from"` To []string `json:"to"` Subject string `json:"subject"` HTML string `json:"html"` } func NewEmailService(apiKey, fromEmail, fromName, baseURL string) *EmailService { return &EmailService{ apiKey: apiKey, fromEmail: fromEmail, fromName: fromName, baseURL: baseURL, } } func (s *EmailService) SendVerificationEmail(toEmail, username, token string) error { verifyURL := fmt.Sprintf("%s/verify-email?token=%s", s.baseURL, token) html := fmt.Sprintf(`

Привет, %s! 👋

Спасибо за регистрацию в Pulse! Подтверди свой email, нажав на кнопку ниже:

Подтвердить email

Или скопируй ссылку:
%s

`, username, verifyURL, verifyURL, verifyURL) return s.send(toEmail, "Подтверди свой email — Pulse", html) } func (s *EmailService) SendPasswordResetEmail(toEmail, username, token string) error { resetURL := fmt.Sprintf("%s/reset-password?token=%s", s.baseURL, token) html := fmt.Sprintf(`

Сброс пароля

Привет, %s! Мы получили запрос на сброс пароля для твоего аккаунта в Pulse.

Сбросить пароль

Или скопируй ссылку:
%s

`, username, resetURL, resetURL, resetURL) return s.send(toEmail, "Сброс пароля — Pulse", html) } func (s *EmailService) send(to, subject, html string) error { if s.apiKey == "" { fmt.Printf("[EMAIL] Would send to %s: %s\n", to, subject) return nil } payload := ResendRequest{ From: fmt.Sprintf("%s <%s>", s.fromName, s.fromEmail), To: []string{to}, Subject: subject, HTML: html, } jsonData, err := json.Marshal(payload) if err != nil { return err } req, err := http.NewRequest("POST", "https://api.resend.com/emails", bytes.NewBuffer(jsonData)) if err != nil { return err } req.Header.Set("Authorization", "Bearer "+s.apiKey) req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode >= 400 { return fmt.Errorf("resend API error: %d", resp.StatusCode) } return nil }