package services import ( "fmt" "net/smtp" "strings" "neomovies-api/pkg/config" ) type EmailService struct { config *config.Config } func NewEmailService(cfg *config.Config) *EmailService { return &EmailService{ config: cfg, } } type EmailOptions struct { To []string Subject string Body string IsHTML bool } func (s *EmailService) SendEmail(options *EmailOptions) error { if s.config.GmailUser == "" || s.config.GmailPassword == "" { return fmt.Errorf("Gmail credentials not configured") } // Gmail SMTP конфигурация smtpHost := "smtp.gmail.com" smtpPort := "587" auth := smtp.PlainAuth("", s.config.GmailUser, s.config.GmailPassword, smtpHost) // Создаем заголовки email headers := make(map[string]string) headers["From"] = s.config.GmailUser headers["To"] = strings.Join(options.To, ",") headers["Subject"] = options.Subject if options.IsHTML { headers["MIME-Version"] = "1.0" headers["Content-Type"] = "text/html; charset=UTF-8" } // Формируем сообщение message := "" for key, value := range headers { message += fmt.Sprintf("%s: %s\r\n", key, value) } message += "\r\n" + options.Body // Отправляем email err := smtp.SendMail( smtpHost+":"+smtpPort, auth, s.config.GmailUser, options.To, []byte(message), ) return err } // Предустановленные шаблоны email func (s *EmailService) SendVerificationEmail(userEmail, code string) error { options := &EmailOptions{ To: []string{userEmail}, Subject: "Подтверждение регистрации Neo Movies", Body: fmt.Sprintf(`

Neo Movies

Здравствуйте!

Для завершения регистрации введите этот код:

%s

Код действителен в течение 10 минут.

Если вы не регистрировались на нашем сайте, просто проигнорируйте это письмо.

`, code), IsHTML: true, } return s.SendEmail(options) } func (s *EmailService) SendPasswordResetEmail(userEmail, resetToken string) error { resetURL := fmt.Sprintf("%s/reset-password?token=%s", s.config.BaseURL, resetToken) options := &EmailOptions{ To: []string{userEmail}, Subject: "Сброс пароля Neo Movies", Body: fmt.Sprintf(`

Сброс пароля

Вы запросили сброс пароля для вашего аккаунта Neo Movies.

Нажмите на ссылку ниже, чтобы создать новый пароль:

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

Ссылка действительна в течение 1 часа.

Если вы не запрашивали сброс пароля, проигнорируйте это сообщение.


С уважением,
Команда Neo Movies

`, resetURL), IsHTML: true, } return s.SendEmail(options) } func (s *EmailService) SendMovieRecommendationEmail(userEmail, userName string, movies []string) error { moviesList := "" for _, movie := range movies { moviesList += fmt.Sprintf("
  • %s
  • ", movie) } options := &EmailOptions{ To: []string{userEmail}, Subject: "Новые рекомендации фильмов от Neo Movies", Body: fmt.Sprintf(`

    Привет, %s!

    У нас есть новые рекомендации фильмов специально для вас:

    Заходите в приложение, чтобы узнать больше деталей!


    С уважением,
    Команда Neo Movies

    `, userName, moviesList), IsHTML: true, } return s.SendEmail(options) }