82 lines
4.9 KiB
JavaScript
82 lines
4.9 KiB
JavaScript
'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 }; |