const AWS = require('aws-sdk');
const nodemailer = require('nodemailer');
const config = require('../config');
// Инициализация AWS SES
let sesClient = null;
let transporter = null;
const initializeEmailService = () => {
const emailProvider = process.env.EMAIL_PROVIDER || 'aws'; // aws, yandex, smtp
if (emailProvider === 'aws' && config.email?.aws) {
sesClient = new AWS.SES({
accessKeyId: config.email.aws.accessKeyId,
secretAccessKey: config.email.aws.secretAccessKey,
region: config.email.aws.region || 'us-east-1'
});
} else if (emailProvider === 'yandex' || emailProvider === 'smtp') {
const emailConfig = config.email?.[emailProvider] || config.email?.smtp || {};
transporter = nodemailer.createTransport({
host: emailConfig.host || process.env.SMTP_HOST,
port: emailConfig.port || parseInt(process.env.SMTP_PORT || '587', 10),
secure: emailConfig.secure === true || process.env.SMTP_SECURE === 'true',
auth: {
user: emailConfig.user || process.env.SMTP_USER,
pass: emailConfig.password || process.env.SMTP_PASSWORD
}
});
}
};
// Генерация HTML письма с кодом
const generateVerificationEmail = (code) => {
return `
Код подтверждения
Ваш код для регистрации в Nakama:
${code}
Код действителен в течение 15 минут.
`;
};
const sendEmail = async (to, subject, html, text) => {
try {
const emailProvider = process.env.EMAIL_PROVIDER || 'aws';
const fromEmail = process.env.EMAIL_FROM || config.email?.from || 'noreply@nakama.guru';
if (emailProvider === 'aws' && sesClient) {
// Отправка через AWS SES
const params = {
Source: fromEmail,
Destination: {
ToAddresses: [to]
},
Message: {
Subject: {
Data: subject,
Charset: 'UTF-8'
},
Body: {
Html: {
Data: html,
Charset: 'UTF-8'
},
Text: {
Data: text || html.replace(/<[^>]*>/g, ''),
Charset: 'UTF-8'
}
}
}
};
const result = await sesClient.sendEmail(params).promise();
return { success: true, messageId: result.MessageId };
} else if (transporter) {
// Отправка через SMTP (Yandex, Gmail и т.д.)
const info = await transporter.sendMail({
from: fromEmail,
to,
subject,
html,
text: text || html.replace(/<[^>]*>/g, '')
});
return { success: true, messageId: info.messageId };
} else {
throw new Error('Email service not configured');
}
} catch (error) {
console.error('Ошибка отправки email:', error);
throw error;
}
};
const sendVerificationCode = async (email, code) => {
const subject = 'Код подтверждения регистрации - Nakama';
const html = generateVerificationEmail(code);
const text = `Ваш код подтверждения: ${code}. Код действителен 15 минут.`;
return await sendEmail(email, subject, html, text);
};
// Генерация HTML письма с кодом для админа
const generateAdminConfirmationEmail = (code, action, userInfo) => {
const actionText = action === 'add' ? 'добавления админа' : 'удаления админа';
const userDetails = userInfo ? `
Пользователь: @${userInfo.username} (${userInfo.firstName})
${userInfo.adminNumber ? `Номер админа: ${userInfo.adminNumber}
` : ''}
` : '';
return `
Подтверждение ${actionText}
${userDetails}
Код подтверждения:
${code}
Код действителен в течение 5 минут.
`;
};
const sendAdminConfirmationCode = async (code, action, userInfo) => {
const ownerEmail = config.ownerEmail || process.env.OWNER_EMAIL || 'aaem9848@gmail.com';
const actionText = action === 'add' ? 'добавления админа' : 'удаления админа';
const subject = `Код подтверждения ${actionText} - Nakama Moderation`;
const html = generateAdminConfirmationEmail(code, action, userInfo);
const text = `Код подтверждения ${actionText}: ${code}\n\nПользователь: @${userInfo?.username || 'не указан'}\nКод действителен 5 минут.`;
return await sendEmail(ownerEmail, subject, html, text);
};
// Инициализация при загрузке модуля
initializeEmailService();
module.exports = {
sendEmail,
sendVerificationCode,
sendAdminConfirmationCode,
initializeEmailService
};