'use strict'; const nodemailer = require('nodemailer'); const config = require('./config'); function ensureConfigured() { if (!config.emailHost) { const err = new Error('SMTP не настроен (EMAIL_HOST пуст)'); err.status = 503; throw err; } } function sendMail({ to, subject, text }) { ensureConfigured(); const transporter = nodemailer.createTransport({ host: config.emailHost, port: config.emailPort, secure: config.emailSecure, auth: config.emailUser ? { user: config.emailUser, pass: config.emailPassword } : undefined }); return transporter .sendMail({ from: config.mailFrom || config.emailUser, to, subject, text }) .finally(() => transporter.close()); } function sendVerificationCode(email, code, codeNumber) { console.log(`[register] код №${codeNumber} для ${email}: ${code}`); return sendMail({ to: email, subject: `Код подтверждения №${codeNumber}`, text: `Ваш код подтверждения №${codeNumber}: ${code}\n\nКод действителен 10 минут.` }); } function sendApproved(email, { login, password, fio, position, crmUrl, quickLinksUrl, domain }) { const positionLine = position ? `\nДолжность: ${position}` : ''; const domainName = (domain || config.domain).toLowerCase(); const crmLine = crmUrl ? `\n\nАдрес СРМ (задачник): ${crmUrl}` : ''; const linksLine = quickLinksUrl ? `\nСервис быстрых ссылок: ${quickLinksUrl}` : ''; return sendMail({ to: email, subject: 'Регистрация одобрена', text: `Здравствуйте, ${fio}!\n\nВаша заявка на регистрацию одобрена.\n\nВаши данные для входа:\nЛогин: ${login}\nПароль: ${password}${positionLine}\n\nИнструкция по входу в систему:\n• Чтобы зайти под своей учётной записью, на экране входа выберите «Другой пользователь».\n• Логин и пароль едины и для входа на ПК, и для задачника.\n• Если простой логин и пароль не принимаются, введите учётную запись полностью с указанием домена: ${domainName}\\${login}${crmLine}${linksLine}` }); } function sendDenied(email, { fio, reason }) { return sendMail({ to: email, subject: 'Регистрация отклонена', text: `Здравствуйте${fio ? ', ' + fio : ''}!\n\nВаша заявка на регистрацию отклонена.\n${reason ? 'Причина: ' + reason + '\n' : ''}\nЕсли вы считаете это ошибкой, обратитесь к администратору.` }); } function sendPasswordChangeApproved(email, { fio, login, crmUrl, quickLinksUrl, domain }) { const domainName = (domain || config.domain).toLowerCase(); const crmLine = crmUrl ? `\n\nАдрес СРМ (задачник): ${crmUrl}` : ''; const linksLine = quickLinksUrl ? `\nСервис быстрых ссылок: ${quickLinksUrl}` : ''; const loginLine = login ? `\nЛогин: ${login}` : ''; const domainLine = login ? `\n• Если простой логин и пароль не принимаются, введите учётную запись полностью с указанием домена: ${domainName}\\${login}` : ''; return sendMail({ to: email, subject: 'Смена пароля одобрена', text: `Здравствуйте${fio ? ', ' + fio : ''}!\n\nВаша заявка на смену пароля одобрена.${loginLine}\nНовый пароль и ваши данные (ФИО, телефон, почта, должность) обновлены.\n\nИнструкция по входу в систему:\n• Чтобы зайти под своей учётной записью, на экране входа выберите «Другой пользователь».\n• Логин и пароль едины и для входа на ПК, и для задачника.${domainLine}${crmLine}${linksLine}\n\nЕсли вы не запрашивали смену пароля, обратитесь к администратору.` }); } function sendPasswordChangeDenied(email, { fio, reason }) { return sendMail({ to: email, subject: 'Смена пароля отклонена', text: `Здравствуйте${fio ? ', ' + fio : ''}!\n\nВаша заявка на смену пароля отклонена.\n${reason ? 'Причина: ' + reason + '\n' : ''}\nЕсли вы считаете это ошибкой, обратитесь к администратору.` }); } module.exports = { sendVerificationCode, sendApproved, sendDenied, sendPasswordChangeApproved, sendPasswordChangeDenied };