/** * emailService.js — отправка email уведомлений через SMTP. * Использует nodemailer. Настройки из app_settings (category=smtp). */ const nodemailer = require('nodemailer'); const settings = require('./settings'); let _transporter = null; let _configHash = null; async function getTransporter() { const [host, port, user, pass, from, enabled] = await Promise.all([ settings.get('SMTP_HOST', ''), settings.get('SMTP_PORT', '587'), settings.get('SMTP_USER', ''), settings.get('SMTP_PASS', ''), settings.get('SMTP_FROM', 'ZeroPost '), settings.get('SMTP_ENABLED', 'false'), ]); if (enabled !== 'true') return null; if (!host || !user) return null; const hash = `${host}:${port}:${user}:${pass}`; if (_transporter && hash === _configHash) return _transporter; _transporter = nodemailer.createTransport({ host, port: parseInt(port), secure: parseInt(port) === 465, auth: { user, pass }, tls: { rejectUnauthorized: false }, }); _configHash = hash; return _transporter; } /** * Отправить email. * @param {string} to — адрес получателя * @param {string} subject — тема * @param {string} html — HTML тело * @param {string} [text] — plain text fallback */ async function send({ to, subject, html, text }) { const transporter = await getTransporter(); if (!transporter) { console.log(`[Email] SMTP disabled or not configured, skip: ${subject} → ${to}`); return { skipped: true }; } const from = await settings.get('SMTP_FROM', 'ZeroPost '); try { const info = await transporter.sendMail({ from, to, subject, html, text }); console.log(`[Email] sent: ${subject} → ${to} (${info.messageId})`); return { ok: true, messageId: info.messageId }; } catch (err) { console.error(`[Email] send error: ${err.message}`); return { error: err.message }; } } /** * Шаблоны уведомлений */ const templates = { welcome({ email, credits }) { return { subject: 'Добро пожаловать в ZeroPost!', html: `

Привет! 👋

Рады видеть тебя в ZeroPost.

На твой счёт зачислено ${credits} кредитов для начала работы.

Открыть приложение →


ZeroPost · Автоматизация контента

`, }; }, payment_success({ amount, plan, email }) { return { subject: `✅ Оплата ${amount}₽ прошла успешно`, html: `

Оплата подтверждена

Тариф ${plan} активирован.

Сумма: ${amount}₽

История платежей →


ZeroPost · Автоматизация контента

`, }; }, low_credits({ credits, email }) { return { subject: '⚠️ Кредиты заканчиваются', html: `

Осталось ${credits} кредитов

Пополни баланс чтобы продолжить генерацию контента.

Выбрать тариф →


ZeroPost · Автоматизация контента

`, }; }, }; module.exports = { send, templates };